Парсинг аргументов командной строки в 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)