889
|
1
|
|
2 local new_multitable = require "util.multitable".new;
|
|
3 local t_insert = table.insert;
|
|
4 local t_concat = table.concat;
|
|
5 local tostring = tostring;
|
|
6 local unpack = unpack;
|
|
7 local pairs = pairs;
|
|
8 local error = error;
|
|
9 local type = type;
|
|
10 local _G = _G;
|
|
11
|
|
12 local data = new_multitable();
|
|
13
|
|
14 module "objectmanager"
|
|
15
|
|
16 function set(...)
|
|
17 return data:set(...);
|
|
18 end
|
|
19 function remove(...)
|
|
20 return data:remove(...);
|
|
21 end
|
|
22 function get(...)
|
|
23 return data:get(...);
|
|
24 end
|
|
25
|
|
26 local function get_path(path)
|
|
27 if type(path) == "table" then return path; end
|
|
28 local s = {};
|
|
29 for part in tostring(path):gmatch("[%w_]+") do
|
|
30 t_insert(s, part);
|
|
31 end
|
|
32 return s;
|
|
33 end
|
|
34
|
|
35 function get_object(path)
|
|
36 path = get_path(path)
|
|
37 return data:get(unpack(path)), path;
|
|
38 end
|
|
39 function set_object(path, object)
|
|
40 path = get_path(path);
|
|
41 data:set(unpack(path), object);
|
|
42 end
|
|
43
|
|
44 data:set("ls", function(_dir)
|
|
45 local obj, dir = get_object(_dir);
|
|
46 if not obj then error("object not found: " .. t_concat(dir, '/')); end
|
|
47 local r = {};
|
|
48 if type(obj) == "table" then
|
|
49 for key, val in pairs(obj) do
|
|
50 r[key] = type(val);
|
|
51 end
|
|
52 end
|
|
53 return r;
|
|
54 end);
|
|
55 data:set("get", get_object);
|
|
56 data:set("set", set_object);
|
|
57 data:set("echo", function(...) return {...}; end);
|
|
58 data:set("_G", _G);
|
|
59
|
|
60 return _M;
|