seahorse
次にksk001100/seahorseというframework(フレームワーク)を導入します。
このフレームワークはcli(command line interface)を書くためのものです。
cliは、簡単に言うと、これまで実行してきたwhich
やcurl
と同じコマンドのことです。今から自分のコマンドを作成します。
難しそうと思われる方がいるかもしれませんが、seahorse
という素晴らしいframeworkを使えば簡単です。
まずはseahorse
をインストールするわけですが、rustでlibrary(ライブラリ)をインストールするには、Cargo.toml
にpackage nameを書きます。これでbuildする際に自動でインストールされます。
なお、libraryはlib
と略されることがあります。
Cargo.toml
[package]
name = "rust"
version = "0.1.0"
edition = "2021"
[dependencies]
seahorse = "*"
そして、seahorse
を使う本体コードを書いていきます。
src/main.rs
use seahorse::{App, Context};
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
let app = App::new(env!("CARGO_PKG_NAME"))
.action(s)
;
app.run(args);
}
fn s(_c: &Context) {
println!("Hello, world!");
}
内容はとてもシンプル。コマンドを実行するとHello, world!
が出力されます。
$ cargo build
$ ./target/debug/rust
Hello, world!
今までと何が違うのかと言うと、例えば、help
オプションが自動でついています。
$ ./target/debug/rust -h
Name:
rust
Flags:
-h, --help : Show help
seahorse
の凄さを理解してもらうため、読者自身に応用を考えてもらいましょう。
src/main.rs
use seahorse::{App, Context, Command};
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
let app = App::new(env!("CARGO_PKG_NAME"))
.action(s)
.command(
Command::new("yes")
.alias("y")
.action(y),
)
.command(
Command::new("no")
.alias("n")
.action(n),
)
;
app.run(args);
}
fn s(_c: &Context) {
println!("Hello, world!");
}
fn y(_c: &Context) {
println!("yes");
}
fn n(_c: &Context) {
println!("no");
}
これを書いて、作成したコマンドを実行してみてください。
$ ./target/debug/rust
$ ./target/debug/rust y
$ ./target/debug/rust n
コードの差分、要点は以下になります。
use seahorse::{App, Context
+ , Command
};
+
.command(
Command::new("yes")
.alias("y")
.action(y),
)
fn y(_c: &Context) {
println!("yes");
}
これらの値を書き換えたり、追加したりして、自由にコマンドを作ってみてください。
ここで、Command::new
で指定した値はオプション名を意味します。
この場合はrust yes
がこのコマンドの発行です。
alias("y")
で省略を指定することができます。この場合はrust y
になります。
action(y)
は関数のfn y
を指定しており、その中身が実行されます。action
にコマンド本体の処理を書くことになります。
ちなみに、action
は必ずしも関数を使う必要はありません。
例えば、以下のコードを所定の場所に追加してみてください。コマンドはrust t
またはrust t foo
です。
src/main.rs
.command(
Command::new("test")
.alias("t")
.action(|c| println!("Hello, {:?}", c.args)),
)
$ ./target/debug/rust t bluesky
Hello, ["bluesky"]
cli
- CLI
cli
は様々な意味を持ちます。上記のようなcli toolのことを指すこともあれば、terminal操作全般を指すこともあります。
cuiとgui
- CUI, GUI
cuiとguiというものがあります。今使っているのはcui
です。
cli
もほぼ同じような意味で使用されています。
cuiはterminal操作を意味し、guiはグラフィカルなos上の操作を意味します。
c-uiと分けられ、uiは単なるuiです。user interfaceの略。
windowsやmacなど一般的なosは、すべてgui操作が基本です。
author
素晴らしいframeworkを作ってくれてありがとう。