nimでtodoリストのコマンドラインツールを作ろうと思い、
docoptをimportして以下のように記述していました。
# docopt用のコマンドライン引数定義
const doc = """
Usage:
tdnim <action> [<content>] [-l: --label]
Options:
<action> ToDo Action
<content> ToDo Content
-l --label ToDo Label Option
"""
# モジュールのインポート
import system
import docopt
proc main =
let
args = docopt(doc, version = "1.0.0")
action: string = $args["<action>"]
content: string = $args["<content>"]
echo action
echo content
main()
そして以下のように実行しました。
(2つ目のコマンドライン引数無しの状態)
$ nim c tdnim.nim
$ ./tdnim init
するとecho contentの部分でnilと出力された様子。
あれ?stringの未定義の初期値はnilから空文字””へ0.19.0で変更された
はずだったような…。nil checkが必要?
そこで下記公式レファレンスに乗っているisNilのプロシージャで
チェックしてあげればよいだろうと思って勢いでisNil。
if content.isNil:
echo "content is nil."
else :
echo content
user-defined error.
まあそりゃそうですよね。Optionalじゃないもの。isNilなんて無い…。
で結論なんだったかというと、
docoptで引数が取れない場合の返却値は”nil”の文字列でした。
やられた…。
if content == "nil":
echo "content is nil."
else:
echo content
うーん、これIssueにあげようかな、と思ったらあった…。
とりあえず当面は文字列でチェックかな。
https://github.com/docopt/docopt.nim/issues/22
https://github.com/docopt/docopt.nim/pull/25