Разбор командной строки lib VLang

Я хочу написать приложение командной строки с языком программирования V. Есть ли библиотека для разбора командной строки?

5 ответов

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

Пример из репозитория V

import cli { Command, Flag }
import os

fn main() {
    mut cmd := Command{
        name: 'cli'
        description: 'An example of the cli library.'
        version: '1.0.0'
    }
    mut greet_cmd := Command{
        name: 'greet'
        description: 'Prints greeting in different languages.'
        usage: '<name>'
        required_args: 1
        pre_execute: greet_pre_func
        execute: greet_func
        post_execute: greet_post_func
    }
    greet_cmd.add_flag(Flag{
        flag: .string
        required: true
        name: 'language'
        abbrev: 'l'
        description: 'Language of the message.'
    })
    greet_cmd.add_flag(Flag{
        flag: .int
        name: 'times'
        value: '3'
        description: 'Number of times the message gets printed.'
    })
    cmd.add_command(greet_cmd)
    cmd.parse(os.args)
}

Вывод

$ v run ./examples/cli.v 
Usage: cli [flags] [commands]

An example of the cli library.

Flags:
  -help               Prints help information.
  -version            Prints version information.

Commands:
  greet               Prints greeting in different languages.
  help                Prints help information.
  version             Prints version information.

Да , модуль os. этот пример выводит каждый аргумент командной строки

import os

fn main() {
    for arg in os.args {
        println(arg)
    }
}

при запуске в моей системе: program.exe hello! возвращается

D:\Documents\V\program.exe
hello!

Изменить: теперь я вижу, к чему вы стремились с помощью синтаксического анализа командной строки. Нет, не существует никаких модулей, которые бы позволяли вам это делать.

Вы можете использовать официальный flagмодуль. См., Например:https://github.com/vlang/v/blob/689003454b5c60fa13a6a0b44c39f79847806609/tools/performance_compare.v

С точки зрения пользователя это производит что-то вроде этого:

0[13:29:12] /v/nv $ tools/performance_compare --help
performance_compare 0.0.4
-----------------------------------------------
Usage: performance_compare [options] COMMIT_BEFORE [COMMIT_AFTER]

Description:
  Compares V executable size and performance,
  between 2 commits from V's local git history.
  When only one commit is given, it is compared to master.

The arguments should be at least 1 and at most 2 in number.

Options:
  --help <bool>:false       Show this help screen

  --vcrepo <string>:https://github.com/vlang/vc
                            The url of the vc repository. You can clone it
                            beforehand, and then just give the local folder
                            path here. That will eliminate the network ops
                            done by this tool, which is useful, if you want
                            to script it/run it in a restrictive vps/docker.

  --verbose <bool>:false    Be more verbose

  --hyperfine_options <string>:
                            Additional options passed to hyperfine.
                            For example on linux, you may want to pass:
                               --hyperfine_options "--prepare 'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches'"

  --workdir <string>:/tmp   A writable folder, where the comparison will be done.

0[13:29:13] /v/nv $

Есть библиотека nedpals/vargs.

Нативно:

      import os
import flag



const (
    tool_version = '0.0.4'
)


mut fp := flag.new_flag_parser(os.args)
fp.version( tool_version )

С библиотекой v-args:

      import vargs // or import nedpals.vargs for vpm users
import os

fn main() {
    // Second argument removes the first argument which contains the path of the executable.
    mut _args := vargs.new(os.args, 1)
    
    // Use the `alias` method if you want to map an option to an existing option.
    _args.alias('W', 'with')

    // Parsing is now a separate step
    _args.parse()

    println(_args.str())
    println(_args.command)
    println(_args.unknown[0])
    println('with? ' + _args.options['with'])
}
Другие вопросы по тегам