Парсинг аргументов командной строки в Nim#
std/os
#
Для низкоуровневого парсинга аргументов можно воспользоваться модулем os
. Он включает функции, которые предоставляют доступ к строке с аргументами.
Ссылки:
Вот так можно проверить переданы ли программе какие-либо аргументы:
import std/os
if paramCount() == 0:
echo "Usage: cmd [-abc]"; system.quit(1)
std/parseopt
#
Ссылки:
Это стандартный модуль для парсинга аргументов, имеет некоторые особенности.
Для того, чтобы задать опцию вида ключ=значение
, нужно указать их через знак равно или двоеточие.
Работает:
--opt:VAL
, --opt=VAL
, -o:VAL
, -o=VAL
Не работает:
--opt VAL
, -o VAL
При указании значения через пробел оно будет воспринято как позиционный аругмент. Вот пример кода, который это иллюстрирует:
import std/parseopt
var p = initOptParser()
while true:
p.next()
case p.kind
of cmdEnd: break
of cmdShortOption, cmdLongOption:
if p.val == "":
echo "Option: ", p.key
else:
echo "Option and value: ", p.key, ", ", p.val
of cmdArgument:
echo "Argument: ", p.key
Простой парсер#
Парсер ниже предусматривает типичные опции --help
и --version
, обрабатыает случай инвалидной опции и опции с обязательным аргументом.
import std/parseopt
const version: string = "0.1.0"
const help: string = """
Usage: example [options] [<argument>]..
Options:
-o, --opt=VAL option with required value.
-h, --help print this help message and exit.
-v, --version print version and exit."""
proc print_version() = echo version; system.quit(0)
proc print_help() = echo help; system.quit(0)
var p = initOptParser()
while true:
p.next()
case p.kind
of cmdEnd: break
of cmdShortOption, cmdLongOption:
case p.key
of "help", "h": print_help()
of "version", "v": print_version()
of "opt", "o":
if p.val == "":
echo "Missing value for: ", p.key; system.quit(1)
else:
echo "Option and value: ", p.key, ", ", p.val
else:
echo "Unknown option: ", p.key; system.quit(1)
of cmdArgument:
echo "Argument: ", p.key
Альтернативный вариант парсера с явным вызовом итератора getopt():
import std/parseopt
const version: string = "0.1.0"
const help: string = """
Usage: example [options] [<argument>]..
Options:
-o, --opt=VAL option with required value.
-h, --help print this help message and exit.
-v, --version print version and exit."""
proc print_version() = echo version; system.quit(0)
proc print_help() = echo help; system.quit(0)
var p = initOptParser()
for kind, key, val in p.getopt():
case kind
of cmdArgument:
echo "Argument: ", key
of cmdLongOption, cmdShortOption:
case key
of "opt", "o":
if val == "":
echo "Missing value for: ", key; system.quit(1)
else:
echo "Key: ", key, " Value: ", val
of "help", "h": print_help()
of "version", "v": print_version()
else:
echo "Unknown option: ", key; system.quit(1)
of cmdEnd: assert(false)