$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

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

  3. このスライドは前座

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

  5. 作りたいですよね?

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

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

  8. 最初に下準備

  9. とりあえず、全部に実装するトレイトを定義する pub trait Commands { fn help(&self); fn version(&self); fn

    name(&self) -> &str; fn run(&self) -> Result<(), String>; }
  10. helpとversionのオプションはデフォルトで実装 pub trait Commands { fn print_help(&self, options: &Vec<String>, 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 } }
  11. parser 毎度同じみのパーサー 一番最初に来たものはコマンド名として処理する ハイフンがついているものはオプションとして処理する 何もついてないのは引数として処理する

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

    まってる文字列が取れる
  13. 引数 let args = args.iter().filter(|arg| !arg.starts_with(“-”)) .map(|arg| arg.to_string()) .collect(); 条件を反転させるだけ

  14. - cat - ls - ps - rm - touch

    - witch 作ったコマンド
  15. ざっくり紹介します

  16. cat 単純にRustでファイルを開いて一行ずつ読み込んで表示して る -e 最後に$を入れる -n 行番号をつける -b 空白行を入れずに行番号をつける

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

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

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

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

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

    指定したファイルのタイムスタンプと同じ日時にする
  22. touch とは言えファイルの生成もできるようにした

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

  24. これで全部!