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

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

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

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

コマンドライン変数であれこれ処理を分けることになるけど、残念ながら 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);
糖衣構文ほしい。