🔎

複数の Web サイトを CLI からまとめて検索する

2024/01/21に公開

この記事では、search-once という Rust 製の CLI アプリケーションを紹介します。

https://github.com/sankichi92/search-once

背景

職場で、チケット管理ツールや社内 Wiki、ファイル共有システムをまとめて検索したいという声がありました。
実際、次のような場合に、こうしたツールをひとつずつ検索してくことはよくあります。

  • hogehoge に関する議論をどこかで見た記憶があるけど、どこだったかわからない
  • fugafuga というエラーが出たけど、同じエラーに遭遇した他の人はいないだろうか

同じクエリをサービスごとに打ち込んで検索するのは面倒なので、クエリを1回打ち込むだけでまとめて検索できると便利そうです。

つくったもの

これを実現するのが search-once です[1]

インストール

Rust のパッケージマネージャ Cargo を使ってインストールできます[2]

$ cargo install search-once

使い方

seach-once <QUERY> で、設定したサイトの検索結果画面をまとめて開きます[3]

$ search-once hoge
Config: /Users/sankichi92/Library/Application Support/rs.search-once/default-config.yml
github-rust:    https://github.com/search?q=language%3ARust+hoge&type=repositories
crates-io:      https://crates.io/search?q=hoge

実行すると、標準出力に設定ファイルのパスが表示されるので、当該ファイルを編集してください。

$ $EDITOR '/Users/sankichi92/Library/Application Support/rs.search-once/default-config.yml'

上記は macOS の例で、デフォルトの設定ファイルのパスは OS によって異なります。

設定ファイルのフォーマットは、以下のような YAML です。

---
sites:
  - name: github-rust
    url: https://github.com/search?q=language%3ARust+%s&type=repositories
  - name: crates-io
    url: https://crates.io/search?q=%s

url の値の %s 部分がクエリ文字列に置き換えられます。
これは、Chrome のサイト内検索ショートカットのフォーマットと同じです。

--config オプションで設定ファイルのパスの指定もできます。
その他のオプションは search-once --help の出力を参照してください。

$ search-once --help
A tool to search multiple websites at once

Usage: search-once [OPTIONS] <QUERY>

Arguments:
  <QUERY>  

Options:
  -c, --config <FILE>  
  -h, --help           Print help
  -V, --version        Print version

実装

実装は main.rs のバイナリクレートのみで、全部で100行にも満たないシンプルなものです。

https://github.com/sankichi92/search-once/blob/main/src/main.rs


Rust の CLI Book を参照しながら、はじめて Rust で CLI アプリをつくりました。
Ruby 等のスクリプト言語に比べ、ユーザ入力や I/O でエラーの起こりうる箇所に自然と意識が向き、やはり安心してコードが書けます。
また、clap クレートによる CLI 設計や、anyhow クレートによるエラーハンドリングは気が利いていて、CLI アプリの開発体験は非常によかったです。

脚注
  1. UI を考えるのが面倒だったのと、Crates.io で Rust パッケージをリリースしてみたかったのとで、Rust 製 CLI アプリになりました。単に社内向けであれば、ペライチ Web アプリの方が非エンジニアにも使えて便利そうです。 ↩︎

  2. 小さなアプリで簡単にビルドできるため、バイナリ配布はしていません。 ↩︎

  3. wsluwslview コマンドがインストールされていれば、WSL からも利用できます。 ↩︎

Discussion