6月17日に行われたNEW DEBUG!!!!で発表した資料です。 https://caspur.wintu.dev/front/lives/264
Rustで作った自作コマンド群の話@garebare521
View Slide
自己紹介名前:ガレバレとうとうインターンシップ始めた授業とインターンシップで死にそうになってるコーヒーの器具を一式買った
このスライドは前座
皆さん、自作コマンド作りたくないですか?
作りたいですよね?
残念ですがそんなことを思っている間に私が先に作りました
でもフルスクラッチではないので皆さん頑張って下さい
最初に下準備
とりあえず、全部に実装するトレイトを定義するpub trait Commands {fn help(&self);fn version(&self);fn name(&self) -> &str;fn run(&self) -> Result<(), String>;}
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}}
parser毎度同じみのパーサー一番最初に来たものはコマンド名として処理するハイフンがついているものはオプションとして処理する何もついてないのは引数として処理する
オプションlet options = args.iter().filter(|arg| arg.starts_with(“-”)).map(|arg| arg.to_string()).collect();Rustの場合こんな感じにすれば最初の文字がハイフンで始まってる文字列が取れる
引数let args = args.iter().filter(|arg| !arg.starts_with(“-”)).map(|arg| arg.to_string()).collect();条件を反転させるだけ
- cat- ls- ps- rm- touch- witch作ったコマンド
ざっくり紹介します
cat単純にRustでファイルを開いて一行ずつ読み込んで表示してる-e 最後に$を入れる-n 行番号をつける-b 空白行を入れずに行番号をつける
エンジニアの皆様なら実装は想像つきますよね????
lsstd::os::unix::fs::{MetadetaExt, PremisstionsExt}でメタデータと権限を取得あとはディレクトリを回して表示してる存在している権限はライブラリで取得-a 隠しファイルも表示-l ディテールの表示-R 再帰的に表示-r 逆順で表示
psライブラリを使ってuidとプロセスを取得大体ライブラリの例通り実装してオプションにより表示を制限すればいい-x 端末操作以外の全てのプロセスも表示-a 他ユーザーのも含めてすべてのプロセスを表示-l ディテールも表示
rmRustでディレクトリを回して単純に削除してる-r 再帰的にファイルを削除-i 削除する際に同意を求める
touch実はファイルを生成するコマンドじゃない!ライブラリを使って編集時間を取得して更新もしているmetadetaから編集時間などを取得するためまぁまぁ実装するのに疲れた-a 最終アクセスした時間をアップデート-m 最終編集した時間をアップデート-r 指定したファイルのタイムスタンプと同じ日時にする
touchとは言えファイルの生成もできるようにした
witch環境変数PATHを全部読み込んで分割して表示してる-a フルパスの表示
これで全部!