seahorse

次にksk001100/seahorseというframework(フレームワーク)を導入します。

このフレームワークはcli(command line interface)を書くためのものです。

cliは、簡単に言うと、これまで実行してきたwhichcurlと同じコマンドのことです。今から自分のコマンドを作成します。

難しそうと思われる方がいるかもしれませんが、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

seahorseの作者はkskさんです。

素晴らしいframeworkを作ってくれてありがとう。

results matching ""

    No results matching ""