cli: various improvements (#6180)
							parent
							
								
									b88569c845
								
							
						
					
					
						commit
						93e6c3df6a
					
				|  | @ -1,29 +1,30 @@ | ||||||
| module main | module main | ||||||
| 
 | 
 | ||||||
| import cli | import cli { Command, Flag } | ||||||
| import os | import os | ||||||
| 
 | 
 | ||||||
| fn main() { | fn main() { | ||||||
| 	mut cmd := cli.Command{ | 	mut cmd := Command{ | ||||||
| 		name: 'cli' | 		name: 'cli' | ||||||
| 		description: 'An example of the cli library.' | 		description: 'An example of the cli library.' | ||||||
| 		version: '1.0.0' | 		version: '1.0.0' | ||||||
| 	} | 	} | ||||||
| 	mut greet_cmd := cli.Command{ | 	mut greet_cmd := Command{ | ||||||
| 		name: 'greet' | 		name: 'greet' | ||||||
| 		description: 'Prints greeting in different languages.' | 		description: 'Prints greeting in different languages.' | ||||||
|  | 		required_args: 1 | ||||||
| 		pre_execute: greet_pre_func | 		pre_execute: greet_pre_func | ||||||
| 		execute: greet_func | 		execute: greet_func | ||||||
| 		post_execute: greet_post_func | 		post_execute: greet_post_func | ||||||
| 	} | 	} | ||||||
| 	greet_cmd.add_flag(cli.Flag{ | 	greet_cmd.add_flag(Flag{ | ||||||
| 		flag: .string | 		flag: .string | ||||||
| 		required: true | 		required: true | ||||||
| 		name: 'language' | 		name: 'language' | ||||||
| 		abbrev: 'l' | 		abbrev: 'l' | ||||||
| 		description: 'Language of the message.' | 		description: 'Language of the message.' | ||||||
| 	}) | 	}) | ||||||
| 	greet_cmd.add_flag(cli.Flag{ | 	greet_cmd.add_flag(Flag{ | ||||||
| 		flag: .int | 		flag: .int | ||||||
| 		name: 'times' | 		name: 'times' | ||||||
| 		value: '3' | 		value: '3' | ||||||
|  | @ -33,23 +34,24 @@ fn main() { | ||||||
| 	cmd.parse(os.args) | 	cmd.parse(os.args) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn greet_func(cmd cli.Command) { | fn greet_func(cmd Command) { | ||||||
| 	language := cmd.flags.get_string('language') or { | 	language := cmd.flags.get_string('language') or { | ||||||
| 		panic("Failed to get \'language\' flag: $err") | 		panic('Failed to get `language` flag: $err') | ||||||
| 	} | 	} | ||||||
| 	times := cmd.flags.get_int('times') or { | 	times := cmd.flags.get_int('times') or { | ||||||
| 		panic("Failed to get \'times\' flag: $err") | 		panic('Failed to get `times` flag: $err') | ||||||
| 	} | 	} | ||||||
|  | 	name := cmd.args[0] | ||||||
| 	for _ in 0 .. times { | 	for _ in 0 .. times { | ||||||
| 		match language { | 		match language { | ||||||
| 			'english' { | 			'english' { | ||||||
| 				println('Hello World') | 				println('Welcome $name') | ||||||
| 			} | 			} | ||||||
| 			'german' { | 			'german' { | ||||||
| 				println('Hallo Welt') | 				println('Willkommen $name') | ||||||
| 			} | 			} | ||||||
| 			'dutch' { | 			'dutch' { | ||||||
| 				println('Hallo Wereld') | 				println('Welkom $name') | ||||||
| 			} | 			} | ||||||
| 			else { | 			else { | ||||||
| 				println('Unsupported language') | 				println('Unsupported language') | ||||||
|  | @ -60,10 +62,10 @@ fn greet_func(cmd cli.Command) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn greet_pre_func(cmd cli.Command) { | fn greet_pre_func(cmd Command) { | ||||||
| 	println('This is a function running before the main function.\n') | 	println('This is a function running before the main function.\n') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn greet_post_func(cmd cli.Command) { | fn greet_post_func(cmd Command) { | ||||||
| 	println('\nThis is a function running after the main function.') | 	println('\nThis is a function running after the main function.') | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| module cli | module cli | ||||||
| 
 | 
 | ||||||
| type FnCommandCallback fn (cmd Command)? | type FnCommandCallback = fn (cmd Command) ? | ||||||
| 
 | 
 | ||||||
| pub fn (f FnCommandCallback) str() string { | pub fn (f FnCommandCallback) str() string { | ||||||
| 	return 'FnCommandCallback=>' + ptr_str(f) | 	return 'FnCommandCallback=>' + ptr_str(f) | ||||||
|  | @ -23,6 +23,7 @@ pub mut: | ||||||
| 	parent          &Command = 0 | 	parent          &Command = 0 | ||||||
| 	commands        []Command | 	commands        []Command | ||||||
| 	flags           []Flag | 	flags           []Flag | ||||||
|  | 	required_args   int | ||||||
| 	args            []string | 	args            []string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -48,6 +49,7 @@ pub fn (cmd Command) str() string { | ||||||
| 	} | 	} | ||||||
| 	res << '	commands: $cmd.commands' | 	res << '	commands: $cmd.commands' | ||||||
| 	res << '	flags: $cmd.flags' | 	res << '	flags: $cmd.flags' | ||||||
|  | 	res << '	required_args: $cmd.required_args' | ||||||
| 	res << '	args: $cmd.args' | 	res << '	args: $cmd.args' | ||||||
| 	res << '}' | 	res << '}' | ||||||
| 	return res.join('\n') | 	return res.join('\n') | ||||||
|  | @ -78,13 +80,13 @@ pub fn (mut cmd Command) add_commands(commands []Command) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (mut cmd Command) add_command(command Command) { | pub fn (mut cmd Command) add_command(command Command) { | ||||||
| 	for existing_cmd in cmd.commands { | 	mut subcmd := command | ||||||
| 		if existing_cmd.name == command.name { | 	if cmd.commands.contains(subcmd.name) { | ||||||
| 			println("command with the same name \'$command.name\' already exists") | 		println('Command with the name `$subcmd.name` already exists') | ||||||
| 		exit(1) | 		exit(1) | ||||||
| 	} | 	} | ||||||
| 	} | 	subcmd.parent = cmd | ||||||
| 	cmd.commands << command | 	cmd.commands << subcmd | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (mut cmd Command) add_flags(flags []Flag) { | pub fn (mut cmd Command) add_flags(flags []Flag) { | ||||||
|  | @ -94,12 +96,10 @@ pub fn (mut cmd Command) add_flags(flags []Flag) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (mut cmd Command) add_flag(flag Flag) { | pub fn (mut cmd Command) add_flag(flag Flag) { | ||||||
| 	for existing_flag in cmd.flags { | 	if cmd.flags.contains(flag.name) { | ||||||
| 		if existing_flag.name == flag.name { | 		println('Flag with the name `$flag.name` already exists') | ||||||
| 			println("flag with the same name \'$flag.name\' already exists") |  | ||||||
| 		exit(1) | 		exit(1) | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 	cmd.flags << flag | 	cmd.flags << flag | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -115,9 +115,6 @@ pub fn (mut cmd Command) parse(args []string) { | ||||||
| 		cmd.commands.sort(a.name < b.name) | 		cmd.commands.sort(a.name < b.name) | ||||||
| 	} | 	} | ||||||
| 	cmd.args = args[1..] | 	cmd.args = args[1..] | ||||||
| 	for i in 0 .. cmd.commands.len { |  | ||||||
| 		cmd.commands[i].parent = cmd |  | ||||||
| 	} |  | ||||||
| 	if !cmd.disable_flags { | 	if !cmd.disable_flags { | ||||||
| 		cmd.parse_flags() | 		cmd.parse_flags() | ||||||
| 	} | 	} | ||||||
|  | @ -126,10 +123,12 @@ pub fn (mut cmd Command) parse(args []string) { | ||||||
| 
 | 
 | ||||||
| fn (mut cmd Command) add_default_flags() { | fn (mut cmd Command) add_default_flags() { | ||||||
| 	if !cmd.disable_help && !cmd.flags.contains('help') { | 	if !cmd.disable_help && !cmd.flags.contains('help') { | ||||||
| 		cmd.add_flag(help_flag(!cmd.flags.contains('h') && cmd.has_abbrev_flags())) | 		use_help_abbrev := !cmd.flags.contains('h') && cmd.flags.have_abbrev() | ||||||
|  | 		cmd.add_flag(help_flag(use_help_abbrev)) | ||||||
| 	} | 	} | ||||||
| 	if cmd.version != '' && !cmd.flags.contains('version') { | 	if !cmd.disable_version && cmd.version != '' && !cmd.flags.contains('version') { | ||||||
| 		cmd.add_flag(version_flag(!cmd.flags.contains('v') && cmd.has_abbrev_flags())) | 		use_version_abbrev := !cmd.flags.contains('v') && cmd.flags.have_abbrev() | ||||||
|  | 		cmd.add_flag(version_flag(use_version_abbrev)) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -137,7 +136,7 @@ fn (mut cmd Command) add_default_commands() { | ||||||
| 	if !cmd.disable_help && !cmd.commands.contains('help') && cmd.is_root() { | 	if !cmd.disable_help && !cmd.commands.contains('help') && cmd.is_root() { | ||||||
| 		cmd.add_command(help_cmd()) | 		cmd.add_command(help_cmd()) | ||||||
| 	} | 	} | ||||||
| 	if cmd.version != '' && !cmd.commands.contains('version') { | 	if !cmd.disable_version && cmd.version != '' && !cmd.commands.contains('version') { | ||||||
| 		cmd.add_command(version_cmd()) | 		cmd.add_command(version_cmd()) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -150,18 +149,18 @@ fn (mut cmd Command) parse_flags() { | ||||||
| 		mut found := false | 		mut found := false | ||||||
| 		for i in 0 .. cmd.flags.len { | 		for i in 0 .. cmd.flags.len { | ||||||
| 			mut flag := &cmd.flags[i] | 			mut flag := &cmd.flags[i] | ||||||
| 			if flag.matches(cmd.args, cmd.has_abbrev_flags()) { | 			if flag.matches(cmd.args, cmd.flags.have_abbrev()) { | ||||||
| 				found = true | 				found = true | ||||||
| 				flag.found = true | 				flag.found = true | ||||||
| 				cmd.args = flag.parse(cmd.args, cmd.has_abbrev_flags()) or { | 				cmd.args = flag.parse(cmd.args, cmd.flags.have_abbrev()) or { | ||||||
| 					println('failed to parse flag ${cmd.args[0]}: $err') | 					println('Failed to parse flag `${cmd.args[0]}`: $err') | ||||||
| 					exit(1) | 					exit(1) | ||||||
| 				} | 				} | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if !found { | 		if !found { | ||||||
| 			println('invalid flag: ${cmd.args[0]}') | 			println('Command `$cmd.name` has no flag `${cmd.args[0]}`') | ||||||
| 			exit(1) | 			exit(1) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -190,6 +189,12 @@ fn (mut cmd Command) parse_commands() { | ||||||
| 			cmd.execute_help() | 			cmd.execute_help() | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
|  | 		if cmd.required_args > 0 { | ||||||
|  | 			if cmd.required_args > cmd.args.len { | ||||||
|  | 				println('Command `$cmd.name` needs at least $cmd.required_args arguments') | ||||||
|  | 				exit(1) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		cmd.check_required_flags() | 		cmd.check_required_flags() | ||||||
| 		if int(cmd.pre_execute) > 0 { | 		if int(cmd.pre_execute) > 0 { | ||||||
| 			cmd.pre_execute(*cmd) or { | 			cmd.pre_execute(*cmd) or { | ||||||
|  | @ -210,16 +215,6 @@ fn (mut cmd Command) parse_commands() { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (cmd Command) has_abbrev_flags() bool { |  | ||||||
| 	mut has_abbrev := false |  | ||||||
| 	for flag in cmd.flags { |  | ||||||
| 		if flag.abbrev != '' { |  | ||||||
| 			has_abbrev = true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return has_abbrev |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn (cmd Command) check_help_flag() { | fn (cmd Command) check_help_flag() { | ||||||
| 	if !cmd.disable_help && cmd.flags.contains('help') { | 	if !cmd.disable_help && cmd.flags.contains('help') { | ||||||
| 		help_flag := cmd.flags.get_bool('help') or { | 		help_flag := cmd.flags.get_bool('help') or { | ||||||
|  | @ -233,7 +228,7 @@ fn (cmd Command) check_help_flag() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (cmd Command) check_version_flag() { | fn (cmd Command) check_version_flag() { | ||||||
| 	if cmd.version != '' && cmd.flags.contains('version') { | 	if !cmd.disable_version && cmd.version != '' && cmd.flags.contains('version') { | ||||||
| 		version_flag := cmd.flags.get_bool('version') or { | 		version_flag := cmd.flags.get_bool('version') or { | ||||||
| 			return | 			return | ||||||
| 		} // ignore error and handle command normally
 | 		} // ignore error and handle command normally
 | ||||||
|  | @ -251,7 +246,7 @@ fn (cmd Command) check_required_flags() { | ||||||
| 	for flag in cmd.flags { | 	for flag in cmd.flags { | ||||||
| 		if flag.required && flag.value == '' { | 		if flag.required && flag.value == '' { | ||||||
| 			full_name := cmd.full_name() | 			full_name := cmd.full_name() | ||||||
| 			println("flag \'$flag.name\' is required by \'$full_name\'") | 			println('Flag `$flag.name` is required by `$full_name`') | ||||||
| 			exit(1) | 			exit(1) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -274,7 +269,7 @@ fn (cmds []Command) get(name string) ?Command { | ||||||
| 			return cmd | 			return cmd | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return error("command \'$name\' not found.") | 	return error('Command `$name` not found') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (cmds []Command) contains(name string) bool { | fn (cmds []Command) contains(name string) bool { | ||||||
|  | @ -285,4 +280,3 @@ fn (cmds []Command) contains(name string) bool { | ||||||
| 	} | 	} | ||||||
| 	return false | 	return false | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -51,7 +51,6 @@ fn test_if_command_has_default_version_subcommand_if_version_is_set() { | ||||||
| 	assert has_command(cmd, 'version') | 	assert has_command(cmd, 'version') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| fn flag_should_be_set(cmd cli.Command) ? { | fn flag_should_be_set(cmd cli.Command) ? { | ||||||
| 	flag := cmd.flags.get_string('flag')? | 	flag := cmd.flags.get_string('flag')? | ||||||
| 	assert flag == 'value' | 	assert flag == 'value' | ||||||
|  | @ -83,7 +82,6 @@ fn test_if_flag_gets_set_with_abbrev() { | ||||||
| 	cmd.parse(['command', '--flag', 'value']) | 	cmd.parse(['command', '--flag', 'value']) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| fn flag_should_have_value_of_42(cmd cli.Command) ? { | fn flag_should_have_value_of_42(cmd cli.Command) ? { | ||||||
| 	flag := cmd.flags.get_string('flag')? | 	flag := cmd.flags.get_string('flag')? | ||||||
| 	assert flag == 'value' | 	assert flag == 'value' | ||||||
|  | @ -107,7 +105,6 @@ fn test_if_multiple_flags_get_set() { | ||||||
| 	cmd.parse(['command', '-flag', 'value', '-value', '42']) | 	cmd.parse(['command', '-flag', 'value', '-value', '42']) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| fn flag_is_set_in_subcommand(cmd cli.Command) ? { | fn flag_is_set_in_subcommand(cmd cli.Command) ? { | ||||||
| 	flag := cmd.flags.get_string('flag') or { | 	flag := cmd.flags.get_string('flag') or { | ||||||
| 		panic(err) | 		panic(err) | ||||||
|  |  | ||||||
|  | @ -26,7 +26,7 @@ pub fn (flags []Flag) get_all_found() []Flag { | ||||||
| 
 | 
 | ||||||
| pub fn (flag Flag) get_bool() ?bool { | pub fn (flag Flag) get_bool() ?bool { | ||||||
| 	if flag.flag != .bool { | 	if flag.flag != .bool { | ||||||
| 		return error('invalid flag type') | 		return error('Invalid flag type') | ||||||
| 	} | 	} | ||||||
| 	return flag.value == 'true' | 	return flag.value == 'true' | ||||||
| } | } | ||||||
|  | @ -47,7 +47,7 @@ pub fn (flags []Flag) get_bool_or(name string, or_value bool) bool { | ||||||
| 
 | 
 | ||||||
| pub fn (flag Flag) get_int() ?int { | pub fn (flag Flag) get_int() ?int { | ||||||
| 	if flag.flag != .int { | 	if flag.flag != .int { | ||||||
| 		return error('invalid flag type') | 		return error('Invalid flag type') | ||||||
| 	} | 	} | ||||||
| 	return flag.value.int() | 	return flag.value.int() | ||||||
| } | } | ||||||
|  | @ -68,7 +68,7 @@ pub fn (flags []Flag) get_int_or(name string, or_value int) int { | ||||||
| 
 | 
 | ||||||
| pub fn (flag Flag) get_float() ?f64 { | pub fn (flag Flag) get_float() ?f64 { | ||||||
| 	if flag.flag != .float { | 	if flag.flag != .float { | ||||||
| 		return error('invalid flag type') | 		return error('Invalid flag type') | ||||||
| 	} | 	} | ||||||
| 	return flag.value.f64() | 	return flag.value.f64() | ||||||
| } | } | ||||||
|  | @ -89,7 +89,7 @@ pub fn (flags []Flag) get_float_or(name string, or_value f64) f64 { | ||||||
| 
 | 
 | ||||||
| pub fn (flag Flag) get_string() ?string { | pub fn (flag Flag) get_string() ?string { | ||||||
| 	if flag.flag != .string { | 	if flag.flag != .string { | ||||||
| 		return error('invalid flag type') | 		return error('Invalid flag type') | ||||||
| 	} | 	} | ||||||
| 	return flag.value | 	return flag.value | ||||||
| } | } | ||||||
|  | @ -148,7 +148,7 @@ fn (mut flag Flag) parse_raw(args []string) ?[]string { | ||||||
| 		flag.value = args[1] | 		flag.value = args[1] | ||||||
| 		return args[2..] | 		return args[2..] | ||||||
| 	} | 	} | ||||||
| 	return error('missing argument for $flag.name') | 	return error('Missing argument for `$flag.name`') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (mut flag Flag) parse_bool(args []string) ?[]string { | fn (mut flag Flag) parse_bool(args []string) ?[]string { | ||||||
|  | @ -171,7 +171,7 @@ fn (flags []Flag) get(name string) ?Flag { | ||||||
| 			return flag | 			return flag | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return error('flag $name not found.') | 	return error('Flag `$name` not found') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (flags []Flag) contains(name string) bool { | fn (flags []Flag) contains(name string) bool { | ||||||
|  | @ -183,10 +183,12 @@ fn (flags []Flag) contains(name string) bool { | ||||||
| 	return false | 	return false | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | fn (flags []Flag) have_abbrev() bool { | ||||||
| fn (mut flags []Flag) sort2() { | 	mut have_abbrev := false | ||||||
|        flags.sort_with_compare(fn (a, b &Flag) int { | 	for flag in flags { | ||||||
|                return compare_strings(&a.name, &b.name) | 		if flag.abbrev != '' { | ||||||
|        }) | 			have_abbrev = true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return have_abbrev | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ fn help_flag(with_abbrev bool) Flag { | ||||||
| 		flag: .bool | 		flag: .bool | ||||||
| 		name: 'help' | 		name: 'help' | ||||||
| 		abbrev: sabbrev | 		abbrev: sabbrev | ||||||
| 		description: 'Prints help information' | 		description: 'Prints help information.' | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -23,7 +23,7 @@ fn help_cmd() Command { | ||||||
| 	return Command{ | 	return Command{ | ||||||
| 		name: 'help' | 		name: 'help' | ||||||
| 		usage: '<command>' | 		usage: '<command>' | ||||||
| 		description: 'Prints help information' | 		description: 'Prints help information.' | ||||||
| 		execute: print_help_for_command | 		execute: print_help_for_command | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -42,7 +42,7 @@ fn print_help_for_command(help_cmd Command) ? { | ||||||
| 			} | 			} | ||||||
| 			if !found { | 			if !found { | ||||||
| 				args := help_cmd.args.join(' ') | 				args := help_cmd.args.join(' ') | ||||||
| 				print('invalid command: $args') | 				print('Invalid command: $args') | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -63,6 +63,9 @@ fn (cmd Command) help_message() string { | ||||||
| 	if cmd.commands.len > 0 { | 	if cmd.commands.len > 0 { | ||||||
| 		help += ' [commands]' | 		help += ' [commands]' | ||||||
| 	} | 	} | ||||||
|  | 	for i in 0 .. cmd.required_args { | ||||||
|  | 		help += ' <arg$i>' | ||||||
|  | 	} | ||||||
| 	if cmd.usage.len > 0 { | 	if cmd.usage.len > 0 { | ||||||
| 		help += ' $cmd.usage' | 		help += ' $cmd.usage' | ||||||
| 	} | 	} | ||||||
|  | @ -72,7 +75,7 @@ fn (cmd Command) help_message() string { | ||||||
| 	} | 	} | ||||||
| 	mut abbrev_len := 0 | 	mut abbrev_len := 0 | ||||||
| 	mut name_len := min_description_indent_len | 	mut name_len := min_description_indent_len | ||||||
| 	if cmd.has_abbrev_flags() { | 	if cmd.flags.have_abbrev() { | ||||||
| 		for flag in cmd.flags { | 		for flag in cmd.flags { | ||||||
| 			abbrev_len = max(abbrev_len, flag.abbrev.len + spacing + 1) // + 1 for '-' in front
 | 			abbrev_len = max(abbrev_len, flag.abbrev.len + spacing + 1) // + 1 for '-' in front
 | ||||||
| 			name_len = max(name_len, abbrev_len + flag.name.len + spacing + 2) // + 2 for '--' in front
 | 			name_len = max(name_len, abbrev_len + flag.name.len + spacing + 2) // + 2 for '--' in front
 | ||||||
|  | @ -92,10 +95,10 @@ fn (cmd Command) help_message() string { | ||||||
| 		help += 'Flags:\n' | 		help += 'Flags:\n' | ||||||
| 		for flag in cmd.flags { | 		for flag in cmd.flags { | ||||||
| 			mut flag_name := '' | 			mut flag_name := '' | ||||||
| 			if flag.abbrev != '' && cmd.has_abbrev_flags() { | 			if flag.abbrev != '' && cmd.flags.have_abbrev() { | ||||||
| 				abbrev_indent := ' '.repeat(abbrev_len - flag.abbrev.len - 1) // - 1 for '-' in front
 | 				abbrev_indent := ' '.repeat(abbrev_len - flag.abbrev.len - 1) // - 1 for '-' in front
 | ||||||
| 				flag_name = '-$flag.abbrev$abbrev_indent--$flag.name' | 				flag_name = '-$flag.abbrev$abbrev_indent--$flag.name' | ||||||
| 			} else if cmd.has_abbrev_flags() { | 			} else if cmd.flags.have_abbrev() { | ||||||
| 				abbrev_indent := ' '.repeat(abbrev_len) | 				abbrev_indent := ' '.repeat(abbrev_len) | ||||||
| 				flag_name = '$abbrev_indent--$flag.name' | 				flag_name = '$abbrev_indent--$flag.name' | ||||||
| 			} else { | 			} else { | ||||||
|  |  | ||||||
|  | @ -6,14 +6,14 @@ fn version_flag(with_abbrev bool) Flag { | ||||||
| 		flag: .bool | 		flag: .bool | ||||||
| 		name: 'version' | 		name: 'version' | ||||||
| 		abbrev: sabbrev | 		abbrev: sabbrev | ||||||
| 		description: 'Prints version information' | 		description: 'Prints version information.' | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn version_cmd() Command { | fn version_cmd() Command { | ||||||
| 	return Command{ | 	return Command{ | ||||||
| 		name: 'version' | 		name: 'version' | ||||||
| 		description: 'Prints version information' | 		description: 'Prints version information.' | ||||||
| 		execute: version_func | 		execute: version_func | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue