I want to write a command line application with the V programming language. Is there a library for command line parsing?
Asked
Active
Viewed 1,540 times
5 Answers
8
As of November 2020, the command-line arguments parsing is included in the standard library.
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)
}
Output
$ 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.

ilyazub
- 1,226
- 13
- 23
5
yes, the os module. this example outputs each command line argument
import os
fn main() {
for arg in os.args {
println(arg)
}
}
when run on my system: program.exe hello!
returns
D:\Documents\V\program.exe
hello!
Edit: I now see what you were aiming for with command line parsing. No, there are no existing modules that allow you to do this.

Xander Bielby
- 161
- 1
- 12
-
1I wouldn't consider `os` a library for command line parsing. I was looking for something like e.g. Python's [Click](https://click.palletsprojects.com/en/7.x/). – thinwybk Aug 09 '19 at 06:30
5
You can use the official flag
module.
See for example:
https://github.com/vlang/v/blob/689003454b5c60fa13a6a0b44c39f79847806609/tools/performance_compare.v#L204
This produces something like this from the user perspective:
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 $

Dangelov
- 701
- 6
- 14
4
There is the nedpals/vargs library.

adelarsq
- 3,718
- 4
- 37
- 47
-
It seems that this answer should not be considered as an accepted one, since https://github.com/nedpals/vargs repository is archived already 3-4 years and there are other modern solutions provided in other answers. Please change accepted answer for the benefit of others. – lospejos Jun 07 '23 at 17:00
1
Natively:
import os
import flag
const (
tool_version = '0.0.4'
)
mut fp := flag.new_flag_parser(os.args)
fp.version( tool_version )
With v-args library:
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'])
}

chovy
- 72,281
- 52
- 227
- 295