$30 off During Our Annual Pro Sale. View Details »

Rustで作った自作コマンド群の話

 Rustで作った自作コマンド群の話

6月17日に行われたNEW DEBUG!!!!で発表した資料です。
https://caspur.wintu.dev/front/lives/264

garebare

June 17, 2022
Tweet

More Decks by garebare

Other Decks in Programming

Transcript

  1. Rustで作った
    自作コマンド群の話
    @garebare521

    View Slide

  2. 自己紹介
    名前:ガレバレ
    とうとうインターンシップ始めた
    授業とインターンシップで死にそうに
    なってる
    コーヒーの器具を一式買った

    View Slide

  3. このスライドは前座

    View Slide

  4. 皆さん、自作コマンド
    作りたくないですか?

    View Slide

  5. 作りたいですよね?

    View Slide

  6. 残念ですがそんなことを思っている間に
    私が先に作りました

    View Slide

  7. でもフルスクラッチではないので
    皆さん頑張って下さい

    View Slide

  8. 最初に下準備

    View Slide

  9. とりあえず、全部に実装するトレイトを定義する
    pub trait Commands {
    fn help(&self);
    fn version(&self);
    fn name(&self) -> &str;
    fn run(&self) -> Result<(), String>;
    }

    View Slide

  10. helpとversionのオプションはデフォルトで実装
    pub trait Commands {
    fn print_help(&self, options: &Vec, arg: &str) -> bool {
    if options.contains(&"--help".to_string())
    || options.contains(&"-help".to_string())
    || options.contains(&"-h".to_string())
    || arg == "help"
    {
    self.help();
    return true;
    }
    false
    }
    }

    View Slide

  11. parser
    毎度同じみのパーサー
    一番最初に来たものはコマンド名として処理する
    ハイフンがついているものはオプションとして処理する
    何もついてないのは引数として処理する

    View Slide

  12. オプション
    let options = args.iter().filter(|arg| arg.starts_with(“-”))
    .map(|arg| arg.to_string())
    .collect();
    Rustの場合こんな感じにすれば最初の文字がハイフンで始
    まってる文字列が取れる

    View Slide

  13. 引数
    let args = args.iter().filter(|arg| !arg.starts_with(“-”))
    .map(|arg| arg.to_string())
    .collect();
    条件を反転させるだけ

    View Slide

  14. - cat
    - ls
    - ps
    - rm
    - touch
    - witch
    作ったコマンド

    View Slide

  15. ざっくり紹介します

    View Slide

  16. cat
    単純にRustでファイルを開いて一行ずつ読み込んで表示して

    -e 最後に$を入れる
    -n 行番号をつける
    -b 空白行を入れずに行番号をつける

    View Slide

  17. エンジニアの皆様なら
    実装は想像つきますよね????

    View Slide

  18. ls
    std::os::unix::fs::{MetadetaExt, PremisstionsExt}でメタデー
    タと権限を取得
    あとはディレクトリを回して表示してる
    存在している権限はライブラリで取得
    -a 隠しファイルも表示
    -l ディテールの表示
    -R 再帰的に表示
    -r 逆順で表示

    View Slide

  19. ps
    ライブラリを使ってuidとプロセスを取得
    大体ライブラリの例通り実装してオプションにより表示を制限す
    ればいい
    -x 端末操作以外の全てのプロセスも表示
    -a 他ユーザーのも含めてすべてのプロセスを表示
    -l ディテールも表示

    View Slide

  20. rm
    Rustでディレクトリを回して単純に削除してる
    -r 再帰的にファイルを削除
    -i 削除する際に同意を求める

    View Slide

  21. touch
    実はファイルを生成するコマンドじゃない!
    ライブラリを使って編集時間を取得して更新もしている
    metadetaから編集時間などを取得するためまぁまぁ実装する
    のに疲れた
    -a 最終アクセスした時間をアップデート
    -m 最終編集した時間をアップデート
    -r 指定したファイルのタイムスタンプと同じ日時にする

    View Slide

  22. touch
    とは言えファイルの生成もできるようにした

    View Slide

  23. witch
    環境変数PATHを全部読み込んで分割して表示してる
    -a フルパスの表示

    View Slide

  24. これで全部!

    View Slide