🔖

deno.land/x/dax で pipe処理を楽に書くためのdax_extrasを作成した

2023/12/07に公開

この記事はDeno Advent Calendar 2023 7日目の記事です

経緯

google/zx inspired shell実行用のライブラリとしてdenoの dax があります。
bashには下記のような苦しみを感じており、daxは良いと思い使い始めました。

  • 引数処理の書き方覚えられない、難しい
  • commコマンドで集合扱う方法覚えられない
  • 変数展開覚えられない
  • 便利なライブラリは使っていきたいが、ポータビリティを確保したい

が、daxを書いていると特にpipe周りがshellと比べて書きにくいと感じました。
これが

command1 | command2

こうなる

const child = $`command1`.stdout("piped").spawn();
await $`command2`.stdin(child.stdout());

pipeを足すのはどうかというissueを書いていたところ他にも欲しい人が現れたので、daxにメソッドを追加するプラグインとしてdax_extrasを作成しました。

使い方

await $`command1`.pipe(`command2`);

もしくは

await $`command1`.$(`command2`):

と書けるようになります。
またpipeの他にmapfilterxargsなどを実装しています。

await $`command`.map((line) => { return `prefix:${line}`; }).lines();
await $`command`.filter((line) => { return line.length > 4; }).lines();
await $`command1`.xargs((line) => { return $`command2 ${line}`; });

詳しくはdeno.land/x/dax_extras参照。

課題

標準エラーまわりに対応していないのを必要になったらなんとかしたいと思っています。
また使っていると、awkの$1のような記法をうまく代替できないという細かいつまづきが見つかっておりできればなんとかしたいなと考えています(アイディアが欲しい)。

Discussion