You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.4 KiB
110 lines
2.4 KiB
-- --- SDE-COPYRIGHT-NOTE-BEGIN --- |
|
-- This copyright note is auto-generated by ./scripts/Create-CopyPatch. |
|
-- |
|
-- Filename: package/.../sam/sam/cli.lua |
|
-- Copyright (C) 2006 The T2 SDE Project |
|
-- |
|
-- More information can be found in the files COPYING and README. |
|
-- |
|
-- This program is free software; you can redistribute it and/or modify |
|
-- it under the terms of the GNU General Public License as published by |
|
-- the Free Software Foundation; version 2 of the License. A copy of the |
|
-- GNU General Public License can be found in the file COPYING. |
|
-- --- SDE-COPYRIGHT-NOTE-END --- |
|
|
|
sam = sam or {} |
|
|
|
--[[ DESCRIPTION ] ---------------------------------------------------------- |
|
|
|
Provided functions: |
|
|
|
cli = sam.cli(def) |
|
|
|
Define a CLI command set. The table "def" consist of key->function |
|
mappings, e.g. sam.cli { help = cli_cmd_help }. The return value is |
|
a CLI object with the following methods: |
|
|
|
cli:run() |
|
cli() |
|
|
|
Start the event loop. |
|
|
|
cli:finish() |
|
|
|
Leave the event loop. |
|
|
|
cli:send(...) |
|
|
|
Send a message (printf format). A trailing newline is appended |
|
automatically. |
|
|
|
cli:get() |
|
|
|
Used in the event loop: read (and tokenize) input |
|
|
|
--]] ------------------------------------------------------------------------ |
|
|
|
require "sam.tokenize" |
|
|
|
local __cli = { |
|
ok = true, |
|
command = { |
|
-- default wildcard command |
|
["*"] = function(self,cmd,...) |
|
self:send("[ERROR] unknown command: %s", cmd or "<none>") |
|
end, |
|
-- default "exit" command |
|
exit = function(self,...) self:finish() end, |
|
} |
|
} |
|
|
|
function __cli:finish() |
|
self.ok = false |
|
end |
|
|
|
function __cli:get() |
|
local line = io.stdin:read("*line") |
|
return sam.tokenize(line) |
|
end |
|
|
|
function __cli:send(...) |
|
io.stdout:write(string.format(unpack(arg))) |
|
io.stdout:write("\n") |
|
end |
|
|
|
function __cli:run() |
|
-- event loop |
|
while self.ok do |
|
-- wait for input |
|
local args = self:get() |
|
if not args then |
|
self.ok = false |
|
return |
|
end |
|
|
|
local cmd = args[1] ; table.remove(args, 1) |
|
|
|
-- check command |
|
if self.command[cmd] then |
|
self.command[cmd](self, unpack(args or {})) |
|
else |
|
self.command['*'](self, cmd, unpack(args or {})) |
|
end |
|
end |
|
end |
|
|
|
function sam.cli(def) |
|
local retval = __cli |
|
|
|
-- install commands |
|
for k,v in pairs(def) do |
|
sam.dbg("CLI", "Installing command '%s'\n", k) |
|
retval.command[k] = v |
|
end |
|
|
|
-- make retval executable |
|
setmetatable(retval, { __call = function(self) self:run() end }) |
|
|
|
return retval |
|
end |
|
|
|
|