Open4

zig で環境変数管理の為の CLI ツールを作る(Windows 用)

KeiKei

つくるよ!
auto-env set NODE_ENV=production ってやったらそれ以降同じ CWD で node を実行した時に NODE_ENV=production が自動で読み込まれるようにしたい。

KeiKei

とりあえず node コマンドを乗っ取るには PATH の先頭に自作の node.exe を突っ込めばよい。
どうやって本当の node.exe を見つけるのかについては、where という便利なコマンドがあるみたい。
………"どこ"てなんやねん。

KeiKei

Windows の環境変数自体を書き換える必要があるのかと思ったけど、zig で子プロセスを生やす時に使う std.process.Childenv_map というまさに環境変数を設定できるマップを変数として渡せるみたい。
現在の環境変数マップは std.process.getEnvMap() から取得できる。
これで取得したマップを編集しても OS の環境変数設定には適用されないので安心。

KeiKei

コマンドライン変数であれこれ処理を分けることになるけど、残念ながら zig では文字列での switch ができない。
if (std.mem.eql(...)) を繰り返すとかの代替方法があるが、とりあえずシンプルにしたいので StaticStringMap を使う。
関数を直接書き込むことはできないので、少し回りくどいが struct 経由で関数を定義する。
こんな感じで定義してやれば、各コマンド用のハンドラを設定することができる。

const Handler = *const fn (std.mem.Allocator) !void; 
const handler_map = std.StaticStringMap(Handler).initStatic(
    .{ "command", struct { pub fn handler(allocator: std.mem.Allocator) !void {} }.handler }
);

const handler = handler_map.get(command) orelse {
    // 未定義コマンドが入力された時の処理
    return;
};

handler(allocator);

糖衣構文ほしい。