[PATCH 4/7] box/console: Refactor command handling
Cyrill Gorcunov
gorcunov at gmail.com
Fri Sep 20 21:45:20 MSK 2019
We will need to parse and verify "\set" commands
in remote console text-wire protocol thus to not
duplicate the code lets factor helper out for
reuse sake.
Part-of #3834
---
src/box/lua/console.lua | 43 +++++++++++++++++++++++++++++++++++------
1 file changed, 37 insertions(+), 6 deletions(-)
diff --git a/src/box/lua/console.lua b/src/box/lua/console.lua
index 27d595bd8..a724e5192 100644
--- a/src/box/lua/console.lua
+++ b/src/box/lua/console.lua
@@ -155,11 +155,16 @@ local function output_save(fmt, opts)
}
end
-local function format(status, ...)
+local function current_output()
local d = box.session.storage.console_output_format
if d == nil then
- d = default_output_format
+ return default_output_format
end
+ return d
+end
+
+local function format(status, ...)
+ local d = current_output()
return output_handlers[d["fmt"]](status, d["opts"], ...)
end
@@ -250,21 +255,46 @@ local operators = {
q = quit
}
-local function preprocess(storage, line)
+--
+-- Generate command arguments from the line to
+-- be passed into command handlers.
+local function parse_operators(line)
local items = {}
for item in string.gmatch(line, '([^%s]+)') do
items[#items + 1] = item
end
if #items == 0 then
- return help_wrapper()
+ return 0, nil
end
if operators[items[1]] == nil then
+ return #items, nil
+ end
+ return #items, items
+end
+
+--
+-- Preprocess a command via operator helpers.
+local function preprocess(storage, line)
+ local nr_items, items = parse_operators(line)
+ if nr_items == 0 then
+ return help_wrapper()
+ end
+ if items == nil then
local msg = "Invalid command \\%s. Type \\help for help."
return format(false, msg:format(items[1]))
end
return operators[items[1]](storage, unpack(items))
end
+--
+-- Return a command without a leading slash.
+local function get_command(line)
+ if line:sub(1, 1) == '\\' then
+ return line:sub(2)
+ end
+ return nil
+end
+
--
-- Evaluate command on local instance
--
@@ -272,8 +302,9 @@ local function local_eval(storage, line)
if not line then
return nil
end
- if line:sub(1, 1) == '\\' then
- return preprocess(storage, line:sub(2))
+ local command = get_command(line)
+ if command then
+ return preprocess(storage, command)
end
if storage.language == 'sql' then
return format(pcall(box.execute, line))
--
2.20.1
More information about the Tarantool-patches
mailing list