|
|
- # Adapted from: https://gist.github.com/bitwes/fe1e2aef8da0940104c8
- # Example of a script that can be run from the command line and parses out options. This is adapted
- # from the Gut command line interface. The first 2 classes are not to be used directly, they are used
- # by the Options class and can be ignored. Start reading after the Options class to get a feel for
- # how it is used, then work backwards.
- #
- # This could be easily extracted out into a class itself, but in the interest of how it is being used
- # I wanted it all in one file. It is yours to do with what you please, but if you make something out
- # of it, I'd love to hear about it. I'm bitwes on godot forums, github, and bitbucket.
- extends Control
-
- #-------------------------------------------------------------------------------
- # Parses the command line arguments supplied into an array that can then be
- # examined and parsed based on how the gut options work.
- #-------------------------------------------------------------------------------
- class CmdLineParser:
- var _opts = []
-
- func _init():
- for i in range(OS.get_cmdline_args().size()):
- _opts.append(OS.get_cmdline_args()[i])
-
- # Search _opts for an element that starts with the option name
- # specified.
- func find_option(name):
- var found = false
- var idx = 0
-
- while(idx < _opts.size() and !found):
- if(_opts[idx].find(name) == 0):
- found = true
- else:
- idx += 1
-
- if(found):
- return idx
- else:
- return -1
-
- # Parse out the value of an option. Values are seperated from
- # the option name with "="
- func get_option_value(full_option):
- var split = full_option.split('=')
-
- if(split.size() > 1):
- return split[1]
- else:
- return null
-
- # Parse out multiple comma delimited values from a command line
- # option. Values are separated from option name with "=" and
- # additional values are comma separated.
- func get_option_array_value(full_option):
- var value = get_option_value(full_option)
- var split = value.split(',')
- return split
-
- func get_array_value(option):
- var to_return = []
- var opt_loc = find_option(option)
- if(opt_loc != -1):
- to_return = get_option_array_value(_opts[opt_loc])
- _opts.remove(opt_loc)
-
- return to_return
-
- # returns the value of an option if it was specfied, otherwise
- # it returns the default.
- func get_value(option, default):
- var to_return = default
- var opt_loc = find_option(option)
- if(opt_loc != -1):
- to_return = get_option_value(_opts[opt_loc])
- _opts.remove(opt_loc)
-
- return to_return
-
- # returns true if it finds the option, false if not.
- func was_specified(option):
- var opt_loc = find_option(option)
- if(opt_loc != -1):
- _opts.remove(opt_loc)
-
- return opt_loc != -1
-
- #-------------------------------------------------------------------------------
- # Simple class to hold a command line option
- #-------------------------------------------------------------------------------
- class Option:
- var value = null
- var option_name = ''
- var default = null
- var description = ''
-
- func _init(name, default_value, desc=''):
- option_name = name
- default = default_value
- description = desc
- value = default_value
-
- func pad(value, size, pad_with=' '):
- var to_return = value
- for i in range(value.length(), size):
- to_return += pad_with
-
- return to_return
-
- func to_s(min_space=0):
- var subbed_desc = description
- if(subbed_desc.find('[default]') != -1):
- subbed_desc = subbed_desc.replace('[default]', str(default))
- return pad(option_name, min_space) + subbed_desc
-
-
- #-------------------------------------------------------------------------------
- # The high level interface between this script and the command line options
- # supplied. Uses Option class and CmdLineParser to extract information from
- # the command line and make it easily accessible.
- #-------------------------------------------------------------------------------
- class Options:
- var options = []
- var _opts = []
- var _banner = ''
-
- func add(name, default, desc):
- options.append(Option.new(name, default, desc))
-
- func get_value(name):
- var found = false
- var idx = 0
-
- while(idx < options.size() and !found):
- if(options[idx].option_name == name):
- found = true
- else:
- idx += 1
-
- if(found):
- return options[idx].value
- else:
- print("COULD NOT FIND OPTION " + name)
- return null
-
- func set_banner(banner):
- _banner = banner
-
- func print_help():
- var longest = 0
- for i in range(options.size()):
- if(options[i].option_name.length() > longest):
- longest = options[i].option_name.length()
-
- print('---------------------------------------------------------')
- print(_banner)
-
- print("\nOptions\n-------")
- for i in range(options.size()):
- print(' ' + options[i].to_s(longest + 2))
- print('---------------------------------------------------------')
-
- func print_options():
- for i in range(options.size()):
- print(options[i].option_name + '=' + str(options[i].value))
-
- func parse():
- var parser = CmdLineParser.new()
-
- for i in range(options.size()):
- var t = typeof(options[i].default)
- if(t == TYPE_INT):
- options[i].value = int(parser.get_value(options[i].option_name, options[i].default))
- elif(t == TYPE_STRING):
- options[i].value = parser.get_value(options[i].option_name, options[i].default)
- elif(t == TYPE_ARRAY):
- options[i].value = parser.get_array_value(options[i].option_name)
- elif(t == TYPE_BOOL):
- options[i].value = parser.was_specified(options[i].option_name)
- elif(t == TYPE_NIL):
- print(options[i].option_name + ' cannot be processed, it has a nil datatype')
- else:
- print(options[i].option_name + ' cannot be processsed, it has unknown datatype:' + str(t))
|