読者です 読者をやめる 読者になる 読者になる

chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

Rust用の文字列展開ライブラリ varsun を作りました

開発 Rust

ヴァルサンとか読みます *1
crates.ioで公開してます → https://crates.io/crates/varsun

どういうライブラリか

やりたかったことは単純に、文字列に埋め込まれた環境変数を展開したかったのです。
具体的にはGo言語の os.ExpandEnv 相当のができればよかった。

使い方
extern crate varsun;

let homedir = varsun::substitute("${HOME}", |name: &str| -> Option<String> {
    match ::std::env::var(name) {
        Ok(val) => Some(val),
        Err(_)  => None,
    }
});

環境変数に限ればヘルパー関数があって、こうなります。

extern crate varsun;

let homedir = varsun::substenvar("${HOME}");
// これは以下と同じだったりします。
// let homedir = varsun::substitute("${HOME}", varsun::envar);
特徴

地味な特徴として、Windows形式での展開が可能です *2
むしろこっちが本命かもしれない。

extern crate varsun;

let homedir = varsun::mswin::substenvar("%USERPROFILE%");

// 実は、varsun::{substitute, substenvar} は cfg!(windows) の結果がtrueの場合とそうじゃない場合で処理が違います。
// 具体的には
// if cfg!(windows) {
//     return varsun::mswin::substitute(src, fn);
// } else {
//     return varsun::posix::substitute(src, fn);
// }
// のようになってます。
TODOとか

検索が適当実装すぎるので、ちゃんとパフォーマンスが出るであろう実装にしたい*3

メモ

標準ライブラリで環境変数展開ができれば要らなくなるはずなんですけどねー

*1:VARiable SUbstitioN の略

*2:既存ライブラリはあったけど$HOGE 形式しかだめだったんよ

*3:そのためにはまずベンチマークをとれるようにならないといけないんですが、cargo benchを動かすにはNightlyが必要らしくて、ちょっと面倒だなーっと