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

ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

mruby-argtable というものを書いた

github.com

宜しくお願いします。こんな感じです。

t = Argtable.new
t.literal("v", "verbose", "You are verbose")
t.integer("c", "count", "<c>", "My count")
t.double("s", "seconds", "<t>", "My seconds")
t.string("n", "name", "<n>", "My name")

t.parse(["prog", "-c", "9999", "--verbose", "--name=udzura", "-s", "12.25"])

t["v"].count #=> 1, no value
t["c"].value #=> 9999
t["n"].value #=> "udzura"
t["s"].value #=> 12.25

t.glossry
# -v, --verbose             You are verbose
# -c, --count=<c>           My count
# -s, --seconds=<t>         My seconds
# -n, --name=<n>            My name

テストという名のサンプル もあります。

optparseのmruby移植もあったんですけど、せっかくなので練習も兼ねCの argtable をラップする奴を書いた。

今の所、mgemを入れる時に取得するようにしています。なんかリポジトリに最初から含めた方がいい気もしている。

mgem-listには申請中ですマージされました。→ Add mruby-argtable by udzura · Pull Request #179 · mruby/mgem-list · GitHub

# mgemの依存に追加する例。
MRuby::Gem::Specification.new('your-cli') do |spec|
  spec.bins = ["your-cli"]

  spec.add_dependency 'mruby-argtable', mgem: 'mruby-argtable'
  #...
end

mruby-cli 本体にはオプションパーサーは添付されていないので、組み合わせると幸せになるかも。

github.com

今の所、mrubyのHEADだと??な感じでテストが失敗するので、何かをします。 (mruby-cliがデフォルトで使うっぽい) 1.2.0 ならOK。


mruby-argtable のAPI、最初は元のCのインタフェースに忠実な感じで、こうだった(一応今も動く)けど、

a = Argtable::Literal.new("a", "aaa", "aaa aaa")
b = Argtable::Literal.new("b", "bbb", "bbb bbb")
t = Argtable.new
t.push a; t.push b
t.compile

t.parse(["prog", "-a"])
a.count

あまりに、罠が多そう(例えばcompile必ず呼ぶところとか)なので、必要なものは暗黙に呼んだりする今の形に変更した。

Rubyらしさ」というか「Rubyとして使いたいか」みたいな設計の感じは、CRubyと一緒な感じがする。