@@ -14,6 +14,8 @@ var self_man_link: Interaction
1414var self_enter_link : Interaction
1515var self_example_links := {}
1616
17+ var _is_valid : bool = true
18+
1719func _init (command_name : String ,
1820 functionality : Callable ,
1921 in_arguments : Array [CommandArgument ] = [],
@@ -33,43 +35,83 @@ func _init(command_name: String,
3335 self_man_link .from_raw ("man" , command )
3436 self_enter_link .from_raw ("enter" , command )
3537
38+ _validate_self ()
39+
3640 for example in examples :
3741 var example_link = Interaction .new ()
3842 example_link .from_raw ("enter" , example )
3943 self_example_links [example ] = example_link
4044
45+ func _validate_self ():
46+ var optional_mode : bool = false
47+ for argument in arguments :
48+ if optional_mode and not argument .is_optional ():
49+ _is_valid = false
50+ return
51+ if argument .is_optional ():
52+ optional_mode = true
53+
54+ func is_valid_command ():
55+ return _is_valid
56+
4157func get_command_name () -> String :
4258 return command
4359
4460func execute (in_arguments : Array ) -> String :
45- if in_arguments .size () != arguments .size ():
61+ if arguments . size () > 0 and in_arguments .size () < arguments . filter ( func ( argument ): return not argument . is_optional ()) .size ():
4662 Console .search_and_execute_command ("argument_not_matching %s " % command )
4763 return ""
4864
65+ if arguments .size () > 0 and in_arguments .size () > arguments .size ():
66+ Console .search_and_execute_command ("to_many_arguments %s %s %s " % [command , in_arguments .size (), arguments .size ()])
67+ Console .search_and_execute_command ("man %s " % [command ])
68+ return ""
69+
70+ if ! _validate_arguments (in_arguments ):
71+ return ""
72+
73+
74+ var converted_data : Array [Variant ] = []
75+ for i in arguments .size ():
76+ var raw_data : String = _get_data_at_position (in_arguments , arguments [i ], i )
77+ var data = arguments [i ].convert_data (raw_data )
78+ converted_data .append (data )
79+
80+ var data = function .callv (converted_data )
81+ if data == null :
82+ data = ""
83+ return data
84+
85+ func _get_data_at_position (in_arguments : Array , current_argument : CommandArgument , data_index : int ) -> String :
86+ var value : String = ""
87+ if current_argument .is_optional ():
88+ value = current_argument .get_default_value ()
89+ if data_index < in_arguments .size ():
90+ value = in_arguments [data_index ]
91+ return value
92+
93+
94+
95+ func _validate_arguments (in_arguments : Array ) -> bool :
4996 var is_valid : bool = true
50- for i in in_arguments .size ():
97+ for i in arguments .size ():
5198 var current_argument_type = arguments [i ]
52- if not current_argument_type .is_valid_for (in_arguments [i ]):
99+
100+ var value : String = _get_data_at_position (in_arguments , current_argument_type , i )
101+
102+ if not current_argument_type .is_valid_for (value ):
53103 is_valid = false
54104 var data = "%s %s %s %s %s " % ["argument_not_valid" ,
55105 command ,
56106 current_argument_type .get_display_name ().to_snake_case (),
57107 current_argument_type .Type .keys ()[current_argument_type .get_type ()],
58- in_arguments [ i ]
108+ value
59109 ]
60110 Console .search_and_execute_command (data )
61- return ""
111+ return is_valid
62112
63-
64- var converted_data : Array [Variant ] = []
65- for i in in_arguments .size ():
66- var data = arguments [i ].convert_data (in_arguments [i ])
67- converted_data .append (data )
68-
69- var data = function .callv (converted_data )
70- if data == null :
71- data = ""
72- return data
113+ return is_valid
114+
73115
74116func get_interactive_command ():
75117 var url_part = "[url=%s ]" % self_man_link .get_as_string ()
@@ -101,10 +143,13 @@ func get_man_page() -> String:
101143 return_text += "\n [i][b]Arguments[/b][/i]\n\n "
102144 return_text += "[ul]"
103145 for argument in arguments :
146+ if argument .is_optional ():
147+ return_text += "[Optional] "
104148 return_text += "%s " % argument .get_display_name ()
105149 var argument_description = argument .get_description ()
106150 if not argument_description .is_empty ():
107151 return_text += " -> %s " % argument_description
152+
108153 return_text += "\n "
109154
110155 return_text += "[/ul]"
0 commit comments