-
Notifications
You must be signed in to change notification settings - Fork 0
/
subcommand.v
105 lines (88 loc) · 2.42 KB
/
subcommand.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
module clip
import math.util as math
import os
import strings
pub struct Subcommand {
before string
pub:
name string [required]
short string
help string
version string
author string
about string
usages []string
flags []Flag
options []Opt
subcommands []Subcommand
footer string
}
fn (cmd Subcommand) print(before string) {
println(cmd.format(before, Colorizers{}, 'NO_COLOR' !in os.environ()))
}
// Prints out help message
//
// Should be called only from App
fn (cmd Subcommand) format(before string, colorizers Colorizers, colorized bool) string {
mut bldr := strings.new_builder(256)
if !is_empty(cmd.name) || !is_empty(cmd.version) {
bldr.writeln('$before $cmd.version')
}
if !is_empty(cmd.author) {
bldr.writeln(cmd.author)
}
if !is_empty(cmd.about) {
bldr.writeln(cmd.about)
}
bldr.writeln('')
if !is_empty(cmd.usages) {
bldr.writeln(colorize(colorized, colorizers.category, 'Usage:'))
for usage in cmd.usages {
bldr.write_string(indent)
bldr.write_string(before)
bldr.write_string(' ')
bldr.writeln(usage)
}
}
if !is_empty(cmd.flags) {
bldr.writeln('')
cmd.flags.format(mut bldr, colorized, colorizers)
}
if !is_empty(cmd.options) {
bldr.writeln('')
cmd.options.format(mut bldr, colorized, colorizers)
}
if !is_empty(cmd.subcommands) {
bldr.writeln('')
cmd.subcommands.format(mut bldr, colorized, colorizers)
}
if !is_empty(cmd.footer) {
bldr.writeln('')
bldr.writeln(cmd.footer)
}
return bldr.str()
}
fn (subcommands []Subcommand) format(mut bldr strings.Builder, colorized bool, colorizers Colorizers) {
bldr.writeln(colorize(colorized, colorizers.category, 'Subcommands:'))
mut max_name_len := 0
mut max_short_len := 0
for subcmd in subcommands {
max_name_len = math.imax(max_name_len, subcmd.name.len)
max_short_len = math.imax(max_short_len, subcmd.short.len)
}
for subcmd in subcommands {
bldr.write_string(indent)
if max_short_len != 0 {
if !is_empty(subcmd.short) {
bldr.write_string(' '.repeat(max_short_len - subcmd.short.len))
bldr.write_string(colorize(colorized, colorizers.keyword, subcmd.short))
bldr.write_string(', ')
} else {
bldr.write_string(' '.repeat(max_short_len + 2))
}
}
bldr.write_string(colorize(colorized, colorizers.keyword, subcmd.name))
bldr.write_string(' '.repeat(max_name_len - subcmd.name.len + help_offset))
bldr.writeln(subcmd.help)
}
}