RustとTauriでGUI付きDockerのステータスを表示したりするアプリを作ってみてる件、ちまちまと検証しながら進めているのですが、
main.rs が膨らんでくるとやっぱり「あぁDocker関連のコードを分離したい」となってきます。
そういう時にどうすればいいのか、ちょっとやってみてました。キットもっと楽な方法があるはずなのですが、今の私の知見です。
単純に切り出す
- 切り出す
mod指示でインポートする
例えば元コードがこんな感じ。
| |
ここから hoge() を切り出したければ、まずは単純に切り出してみます。
hoge.rsを作成してお引っ越し
| |
これをmain.rsから読み込ませてみるのは、 mod キーワードでファイル名を渡してモジュールとして認識させることができます。
| |
でもこれはエラーになります。
❯ cargo check
Checking libkiridashi v0.1.0 (/private/tmp/libkiridashi)
error[E0603]: function `hoge` is private
--> src/main.rs:5:26
|
5 | println!("{}", hoge::hoge());
| ^^^^ private function
|
note: the function `hoge` is defined here
--> src/hoge.rs:1:1
|
1 | fn hoge() -> String {
| ^^^^^^^^^^^^^^^^^^^
For more information about this error, try `rustc --explain E0603`.
さすがRust、エラーの詳しさが光ってます。
実はRustのモジュールやライブラリなど、切り出した場合の共有度合いはプライベート(private)だったりします。
「見せられないよ!」です。ということで、晒してかまわない子はpubで見せてあげましょう。
| |
これで動きます。 この方法でやるのが単一アプリの中での切り出しとしてはやりやすいですね。
ライブラリクレート
バイナリクレートではなくライブラリクレートとして切り出すことで、より分離度が増して良い感じになると思います。 ただこうなると再利用性とかまで考慮しないといけなくなるのでいくぶん面倒かもしれません。
バイナリクレートではありますが、トップディレクトリでライブラリクレートを作って入れ子にしちゃいます。
| |
こんな所ですが作ってしまいます。
| |
で、トップ側のCargo.tomlにkiriを足します。
| |
これぐらい検出して自動的に入れてくれて良いんじゃない? と思ったりもします。
自動はないみたいですが、cargo addはできるみたい。
| |
あとは kiri/src/lib.rs にごりごりっと書いていきます。
| |
&strな文字列を受け取って分解し、反転してStringにするという良くあるようなコードです。
こちらは依存関係に書き込んでいるので、 use で対応しちゃいましょう、と思いましたが、別に書かなくても、裏で勝手にuse宣言相当をしてくれるので書かなくてもOKみたいです。
| |
これで両方とも動いてくれます。
| |
これで少しはコードの分離性が確保できそうです、わーい。