Spec-Zone.ru › Nim

std/parseopt

Источник Редактировать

Этот модуль предоставляет стандартный парсер командной строки Nim. Он поддерживает один удобный итератор для всех параметров командной строки и некоторые функции низкого уровня.

Поддерживаемый синтаксис

Следующий синтаксис поддерживается, когда аргументы для параметров shortNoVal и longNoVal, которые описаны ниже, не предоставляются:

  1. Короткие опции: -abcd, -e:5, -e=5
  2. Длинные опции: --foo:bar, --foo=bar, --foo
  3. Аргументы: всё, что не начинается с -

Эти три типа токенов перечислены в перечислении CmdLineKind.

Когда значения опций начинаются с ':' или '=', они должны быть удвоены (как в --delim::) или чередованы (как в --delim=:).

Опция --, обычно используемая для обозначения того, что каждый последующий токен является аргументом, интерпретируется как длинная опция, и её имя — пустая строка.

Разбор

Для разбора параметров командной строки используйте OptParser. Он может быть создан с помощью initOptParser, а next продвигает парсер на один токен.

Для каждого токена поля парсера kind, key, и val предоставляют информацию об этом токене. Если токен — длинная или короткая опция, то key — имя опции, а val — либо значение опции, если оно предоставлено, либо пустая строка. Для аргументов поле key содержит сам аргумент, а val не используется. Чтобы проверить, достигнут ли конец командной строки, проверьте, равно ли kind cmdEnd.

Вот пример:

import std/parseopt

var p = initOptParser("-ab -e:5 --foo --bar=20 file.txt")
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

# Output:
# Option: a
# Option: b
# Option and value: e, 5
# Option: foo
# Option and value: bar, 20
# Argument: file.txt

Итератор getopt, предоставляемый для удобства, также может использоваться для итерации по всем параметрам командной строки.

Чтобы установить значение по умолчанию для переменной, присвоенной через getopt, и принять аргументы из командной строки. Присвойте значение по умолчанию переменной перед разбором. Затем установите переменную в новое значение во время разбора.

Вот пример:

import std/parseopt

var varName: string = "defaultValue"

for kind, key, val in getopt():
  case kind
  of cmdArgument:
    discard
  of cmdLongOption, cmdShortOption:
    case key:
    of "varName": # --varName:<value> in the console when executing
      varName = val # do input sanitization in production systems
  of cmdEnd:
    discard

shortNoVal и longNoVal

Необязательные параметры shortNoVal и longNoVal, присутствующие в initOptParser, предназначены для указания коротких и длинных опций, которые не принимают значения.

Когда shortNoVal не пусто, пользователям не нужно разделять короткие опции и их значения с помощью ':' или '=', поскольку парсер знает, какие опции принимают значения, а какие нет. Это поведение также применяется к длинным опциям, если longNoVal не пусто. Для коротких опций поддерживается синтаксис -j4, а для длинных опций — --foo bar. Это дополняет ранее упомянутый синтаксис. Пользователи по-прежнему могут разделять опции и их значения с помощью ':' или '=', но это становится необязательным.

По мере добавления в вашу программу больше опций, которые не принимают значения, помните о необходимости соответствующим образом изменять shortNoVal и longNoVal.

Следующий пример иллюстрирует разницу между пустым значением shortNoVal и longNoVal, которое является значением по умолчанию, и предоставлением аргументов для этих двух параметров:

import std/parseopt

proc printToken(kind: CmdLineKind, key: string, val: string) =
  case kind
  of cmdEnd: doAssert(false)  # Doesn't happen with getopt()
  of cmdShortOption, cmdLongOption:
    if val == "":
      echo "Option: ", key
    else:
      echo "Option and value: ", key, ", ", val
  of cmdArgument:
    echo "Argument: ", key

let cmdLine = "-j4 --first bar"

var emptyNoVal = initOptParser(cmdLine)
for kind, key, val in emptyNoVal.getopt():
  printToken(kind, key, val)

# Output:
# Option: j
# Option: 4
# Option: first
# Argument: bar

var withNoVal = initOptParser(cmdLine, shortNoVal = {'c'},
                              longNoVal = @["second"])
for kind, key, val in withNoVal.getopt():
  printToken(kind, key, val)

# Output:
# Option and value: j, 4
# Option and value: first, bar

См. также

  • модуль os для процедур разбора командной строки низкого уровня
  • модуль parseutils для вспомогательных процедур разбора токенов, чисел, идентификаторов и т. д.
  • модуль strutils для общих операций обработки строк
  • модуль json для парсера JSON
  • модуль parsecfg для парсера файла конфигурации
  • модуль parsecsv для простого парсера CSV (значения, разделенные запятыми)
  • модуль parsexml для парсера XML/HTML
  • другие парсеры для других парсеров

Импорты

strutils, os

Типы

CmdLineKind = enum
  cmdEnd,                   ## End of command line reached
  cmdArgument,              ## An argument such as a filename
  cmdLongOption,            ## A long option such as --option
  cmdShortOption             ## A short option such as -c
Обнаруженный токен командной строки. Источник Редактировать
OptParser = object of RootObj
  kind*: CmdLineKind         ## The detected command line token
  key*, val*: string         ## Key and value pair; the key is the option
                             ## or the argument, and the value is not "" if
                             ## the option was given a value

Реализация парсера командной строки.

Для его инициализации используйте процедуру initOptParser.

Источник Редактировать

Процедуры

proc cmdLineRest(p: OptParser): string {....gcsafe, extern: "npo$1", raises: [],
    tags: [], forbids: [].}

Возвращает остаток командной строки, который еще не был обработан.

См. также:

  • процедуру remainingArgs

Примеры:

var p = initOptParser("--left -r:2 -- foo.txt bar.txt")
while true:
  p.next()
  if p.kind == cmdLongOption and p.key == "":  # Look for "--"
    break
doAssert p.cmdLineRest == "foo.txt bar.txt"
Источник Редактировать
proc initOptParser(cmdline = ""; shortNoVal: set[char] = {};
                   longNoVal: seq[string] = @[];
                   allowWhitespaceAfterColon = true): OptParser {....raises: [],
    tags: [ReadIOEffect], forbids: [].}

Инициализирует парсер командной строки.

Если cmdline == "", то фактическая командная строка, предоставленная модулем os, извлекается вместо этого, если доступна. Если командная строка недоступна, будет возбуждено исключение ValueError.

shortNoVal и longNoVal используются для указания опций, которые не принимают значения. Более подробную информацию о том, как это влияет на разбор, см. в документации по этим параметрам.

Это не предоставляет способ передачи значений по умолчанию аргументам.

См. также:

  • итератор getopt

Пример:

var p = initOptParser()
p = initOptParser("--left --debug:3 -l -r:2")
p = initOptParser("--left --debug:3 -l -r:2",
                  shortNoVal = {'l'}, longNoVal = @["left"])
Источник Редактировать
proc initOptParser(cmdline: seq[string]; shortNoVal: set[char] = {};
                   longNoVal: seq[string] = @[];
                   allowWhitespaceAfterColon = true): OptParser {....raises: [],
    tags: [ReadIOEffect], forbids: [].}

Инициализирует парсер командной строки.

Если cmdline.len == 0, то фактическая командная строка, предоставленная модулем os, извлекается вместо этого, если доступна. Если командная строка недоступна, будет возбуждено исключение ValueError. Поведение других параметров остается таким же, как в initOptParser(string, ...).

См. также:

  • итератор getopt

Пример:

var p = initOptParser()
p = initOptParser(@["--left", "--debug:3", "-l", "-r:2"])
p = initOptParser(@["--left", "--debug:3", "-l", "-r:2"],
                  shortNoVal = {'l'}, longNoVal = @["left"])
Источник Редактировать
proc next(p: var OptParser) {....gcsafe, extern: "npo$1", raises: [], tags: [],
                              forbids: [].}

Обрабатывает следующий токен.

p.kind описывает тип обработанного токена. p.key и p.val устанавливаются соответствующим образом.

Пример:

var p = initOptParser("--left -r:2 file.txt")
p.next()
doAssert p.kind == cmdLongOption and p.key == "left"
p.next()
doAssert p.kind == cmdShortOption and p.key == "r" and p.val == "2"
p.next()
doAssert p.kind == cmdArgument and p.key == "file.txt"
p.next()
doAssert p.kind == cmdEnd
Источник Редактировать
proc remainingArgs(p: OptParser): seq[string] {....gcsafe, extern: "npo$1",
    raises: [], tags: [], forbids: [].}

Возвращает последовательность аргументов, которые еще не были обработаны.

См. также:

  • процедуру cmdLineRest

Примеры:

var p = initOptParser("--left -r:2 -- foo.txt bar.txt")
while true:
  p.next()
  if p.kind == cmdLongOption and p.key == "":  # Look for "--"
    break
doAssert p.remainingArgs == @["foo.txt", "bar.txt"]
Источник Редактировать

Итераторы

iterator getopt(cmdline: seq[string] = @[]; shortNoVal: set[char] = {};
                longNoVal: seq[string] = @[]): tuple[kind: CmdLineKind,
    key, val: string] {....raises: [], tags: [ReadIOEffect], forbids: [].}

Удобный итератор для итерации по аргументам командной строки.

Это создаёт новый OptParser. Если аргументов командной строки нет, то фактическая командная строка, предоставленная модулем os, извлекается вместо этого.

shortNoVal и longNoVal используются для указания опций, которые не принимают значения. Более подробную информацию о том, как это влияет на разбор, см. в документации по этим параметрам.

Нет необходимости проверять cmdEnd во время итерации. Если используется getopt с переключением по случаям, проверка на cmdEnd необходима.

См. также:

  • процедуру initOptParser

Примеры:

# these are placeholders, of course
proc writeHelp() = discard
proc writeVersion() = discard

var filename: string
let params = @["--left", "--debug:3", "-l", "-r:2"]

for kind, key, val in getopt(params):
  case kind
  of cmdArgument:
    filename = key
  of cmdLongOption, cmdShortOption:
    case key
    of "help", "h": writeHelp()
    of "version", "v": writeVersion()
  of cmdEnd: assert(false) # cannot happen
if filename == "":
  # no filename has been written, so we show the help
  writeHelp()
Источник Редактировать
iterator getopt(p: var OptParser): tuple[kind: CmdLineKind, key, val: string] {.
    ...raises: [], tags: [], forbids: [].}

Удобный итератор для итерации по предоставленному OptParser.

Нет необходимости проверять cmdEnd во время итерации. Если используется getopt с переключением по случаям, проверка на cmdEnd необходима.

См. также:

  • процедуру initOptParser

Примеры:

# these are placeholders, of course
proc writeHelp() = discard
proc writeVersion() = discard

var filename: string
var p = initOptParser("--left --debug:3 -l -r:2")

for kind, key, val in p.getopt():
  case kind
  of cmdArgument:
    filename = key
  of cmdLongOption, cmdShortOption:
    case key
    of "help", "h": writeHelp()
    of "version", "v": writeVersion()
  of cmdEnd: assert(false) # cannot happen
if filename == "":
  # no filename has been given, so we show the help
  writeHelp()
Источник Редактировать

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/parseopt.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API