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

-- --- 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