🐷

(アイデア募集)Rustライブラリのドキュメントをgo docコマンドの形式で読みたい

2024/03/31に公開

課題

rustupを使用してRustの環境を構築した場合、rustup docコマンドでドキュメントを閲覧できます。例えば以下のコマンドを実行するとstd::fs::Fileのドキュメントが表示されます。

$ rustup doc --std 'std::fs::File'

ただし、上記のコマンドを実行するとブラウザが起動してHTML形式のドキュメントが表示されます。

これはこれで便利なのですが、クレートの概要(//!から始まるコメント)や実装されているトレイト一覧を確認するなど、ちょっとした用途には大袈裟すぎます。

また、私はスクリーンリーダーを利用しているのですが、ドキュメントのHTMLは音声の読み上げがされない箇所があります。

go docコマンドの表示令

参考までにGoのgo docコマンドで表示されるドキュメントの例を示します。

$ go doc os.File

上記はos.Fileのドキュメントを表示するコマンドです。実行すると以下の内容がターミナルに出力されます。

package os // import "os"

type File struct {
	// Has unexported fields.
}
    File represents an open file descriptor.

func Create(name string) (*File, error)
func CreateTemp(dir, pattern string) (*File, error)
func NewFile(fd uintptr, name string) *File
...

RustとGoを比べて優劣を語る意図はありません。これくらいシンプルな形式で表示できると嬉しい、という具体例として紹介したものです。

Rustのドキュメントをプレーンテキストで表示する方法

私が調べた限り、プレーンテキストでドキュメントを表示する方法はなさそうでした。Rustの型システムは複雑なので、プレーンテキストでドキュメントを読む需要が少ないのかも知れません。

現状の対処法

ソースコードを読んで対処しています。まず、以下のコマンドを実行して標準ライブラリのソースコードを入手します。

$ rustup component add rust-src

これでソースコードが閲覧できるようになりました。例えばstd::fs::Fileに対応するfs.rsは以下のパスに格納されています。

$ cd $(rustc --print sysroot)
$ cat ./lib/rustlib/src/rust/library/std/src/fs.rs

あとは適当に正規表現で目的の箇所を探してドキュメントコメントを読むことで対処します。

検討した案

  1. pandoc -f html -t markdownでドキュメントのHTMLをmarkdownに変換→余計な装飾や謎の文字が混入して読むに堪えないものが生成される。
  2. シェルスクリプトで///ドキュメントコメントを抽出→問題なさそうに思えるがRustの言語仕様に詳しくないので、シンタックスの考慮漏れでドキュメントを取りこぼす恐れがある。ASTからコメントを抽出するのが確実そうだが、かなり手間がかかりそう。
  3. rustup docをforkしてmarkdownを生成できるように機能を追加→処理の全体像を把握できていないので案2と同じく手間がかかりそう。そもそもforkして改修するならまずスクリーンリーダーで読み上げできるようにHTMLを修正するべき。

そんなわけで、なるべく手間をかけたくない→ソースコードを読むのが確実という方針で落ち着いています。

おわり

Discussion