Skip to content

Commit 74e3b02

Browse files
Merge branch 'fix/command-parsing-79' into develop
2 parents 400fd0c + 8ba4c13 commit 74e3b02

File tree

2 files changed

+63
-21
lines changed

2 files changed

+63
-21
lines changed

addons/quentincaffeino/console/src/ConsoleLine.gd

+24-21
Original file line numberDiff line numberDiff line change
@@ -99,44 +99,46 @@ func set_text(text, move_caret_to_end = true):
9999
func execute(input):
100100
Console.write_line('[color=#999999]$[/color] ' + input)
101101

102-
# @var PoolStringArray
103-
var rawCommands = RegExLib.split(RECOMMANDS_SEPARATOR, input)
104-
105102
# @var Dictionary[]
106-
var parsedCommands = self._parse_commands(rawCommands)
103+
var parsedCommands = _parse_commands(input)
107104

108105
for parsedCommand in parsedCommands:
109-
# @var Command/Command|null
110-
var command = Console.get_command(parsedCommand.name)
111-
112-
if command:
113-
Console.Log.debug('Executing `' + parsedCommand.command + '`.')
114-
command.execute(parsedCommand.arguments)
115-
Console.emit_signal("command_executed", command)
116-
else:
117-
Console.write_line('Command `' + parsedCommand.name + '` not found.')
118-
Console.emit_signal("command_not_found", parsedCommand.name)
106+
if parsedCommand.name.length():
107+
# @var Command/Command|null
108+
var command = Console.get_command(parsedCommand.name)
109+
110+
if command:
111+
Console.Log.debug('Executing `' + parsedCommand.command + '`.')
112+
command.execute(parsedCommand.arguments)
113+
Console.emit_signal("command_executed", command)
114+
else:
115+
Console.write_line('Command `' + parsedCommand.name + '` not found.')
116+
Console.emit_signal("command_not_found", parsedCommand.name)
119117

120118
Console.History.push(input)
121119
self.clear()
122120

123121

124-
# @param PoolStringArray rawCommands
125-
# @returns Array
126-
func _parse_commands(rawCommands):
122+
# @static
123+
# @param String input
124+
# @returns Array<Dictionary>
125+
static func _parse_commands(input):
127126
var resultCommands = []
128127

128+
# @var PoolStringArray
129+
var rawCommands = RegExLib.split(RECOMMANDS_SEPARATOR, input)
129130
for rawCommand in rawCommands:
130131
if rawCommand:
131-
resultCommands.append(self._parse_command(rawCommand))
132+
resultCommands.append(_parse_command(rawCommand))
132133

133134
return resultCommands
134135

135136

137+
# @static
136138
# @param String rawCommand
137139
# @returns Dictionary
138-
func _parse_command(rawCommand):
139-
var name = null
140+
static func _parse_command(rawCommand):
141+
var name = ''
140142
var arguments = PoolStringArray([])
141143

142144
var beginning = 0 # int
@@ -145,7 +147,8 @@ func _parse_command(rawCommand):
145147
var subString # String|null
146148
for i in rawCommand.length():
147149
# Quote
148-
if rawCommand[i] in QUOTES and i > 0 and not rawCommand[i - 1] in SCREENERS:
150+
if rawCommand[i] in QUOTES and \
151+
(i == 0 or i > 0 and not rawCommand[i - 1] in SCREENERS):
149152
if isInsideQuotes and rawCommand[i] == openQuote:
150153
openQuote = null
151154
isInsideQuotes = false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
extends "res://addons/gut/test.gd"
3+
4+
const ConsoleLine = preload("res://addons/quentincaffeino/console/src/ConsoleLine.gd")
5+
6+
7+
func test_parse_command_simple_command_expect_ok():
8+
var command_name = "command"
9+
var command_line = "%s" % command_name
10+
11+
var result = ConsoleLine._parse_command(command_line)
12+
13+
assert_eq(result.command, command_line)
14+
assert_eq(result.name, command_name)
15+
16+
17+
func test_parse_command_simple_command_with_simple_argument_expect_ok():
18+
var command_name = "command"
19+
var command_arg01 = "arg01"
20+
var command_line = "%s %s" % [command_name, command_arg01]
21+
22+
var result = ConsoleLine._parse_command(command_line)
23+
24+
assert_eq(result.command, command_line)
25+
assert_eq(result.name, command_name)
26+
assert_true(result.arguments.size() == 1)
27+
assert_eq(result.arguments[0], command_arg01)
28+
29+
30+
func test_parse_commands_simple_commands_get_separated_expect_ok():
31+
var command_name01 = "command01"
32+
var command_name02 = "command02"
33+
var command_line = "%s;%s" % [command_name01, command_name02]
34+
35+
var result = ConsoleLine._parse_commands(command_line)
36+
37+
assert_true(result.size() == 2)
38+
assert_eq(result[0].name, command_name01)
39+
assert_eq(result[1].name, command_name02)

0 commit comments

Comments
 (0)