Comparison

util/pluginloader.lua @ 12250:e157e5c79daa

util.pluginloader: Support for multiple pluginloader instances, and options
author Matthew Wild <mwild1@gmail.com>
date Thu, 03 Feb 2022 12:53:19 +0000 (2022-02-03)
parent 11131:40abef01f4b9
child 12251:21ed12cfe300
comparison
equal deleted inserted replaced
12249:5173f8a761a0 12250:e157e5c79daa
17 end 17 end
18 18
19 local io_open = io.open; 19 local io_open = io.open;
20 local envload = require "util.envload".envload; 20 local envload = require "util.envload".envload;
21 21
22 local function load_file(names) 22 local pluginloader_methods = {};
23 local pluginloader_mt = { __index = pluginloader_methods };
24
25 function pluginloader_methods:load_file(names)
23 local file, err, path; 26 local file, err, path;
24 for i=1,#plugin_dir do 27 for i=1,#plugin_dir do
25 for j=1,#names do 28 for j=1,#names do
26 path = plugin_dir[i]..names[j]; 29 path = plugin_dir[i]..names[j];
27 file, err = io_open(path); 30 file, err = io_open(path);
33 end 36 end
34 end 37 end
35 return file, err; 38 return file, err;
36 end 39 end
37 40
38 local function load_resource(plugin, resource) 41 function pluginloader_methods:load_resource(plugin, resource)
39 resource = resource or "mod_"..plugin..".lua";
40 local names = { 42 local names = {
41 "mod_"..plugin..dir_sep..plugin..dir_sep..resource; -- mod_hello/hello/mod_hello.lua 43 "mod_"..plugin..dir_sep..plugin..dir_sep..resource; -- mod_hello/hello/mod_hello.lua
42 "mod_"..plugin..dir_sep..resource; -- mod_hello/mod_hello.lua 44 "mod_"..plugin..dir_sep..resource; -- mod_hello/mod_hello.lua
43 plugin..dir_sep..resource; -- hello/mod_hello.lua 45 plugin..dir_sep..resource; -- hello/mod_hello.lua
44 resource; -- mod_hello.lua 46 resource; -- mod_hello.lua
45 "share"..dir_sep.."lua"..dir_sep..lua_version..dir_sep..resource; 47 "share"..dir_sep.."lua"..dir_sep..lua_version..dir_sep..resource;
46 "share"..dir_sep.."lua"..dir_sep..lua_version..dir_sep.."mod_"..plugin..dir_sep..resource; 48 "share"..dir_sep.."lua"..dir_sep..lua_version..dir_sep.."mod_"..plugin..dir_sep..resource;
47 }; 49 };
48 50
49 return load_file(names); 51 return self:load_file(names);
50 end 52 end
51 53
52 local function load_code(plugin, resource, env) 54 function pluginloader_methods:load_code(plugin, resource, env)
53 local content, err = load_resource(plugin, resource); 55 local content, err = load_resource(plugin, resource);
54 if not content then return content, err; end 56 if not content then return content, err; end
55 local path = err; 57 local path = err;
56 local f, err = envload(content, "@"..path, env); 58 local f, err = envload(content, "@"..path, env);
57 if not f then return f, err; end 59 if not f then return f, err; end
58 return f, path; 60 return f, path;
59 end 61 end
60 62
61 local function load_code_ext(plugin, resource, extension, env) 63 function pluginloader_methods:load_code_ext(plugin, resource, extension, env)
62 local content, err = load_resource(plugin, resource.."."..extension); 64 local content, err = load_resource(plugin, resource.."."..extension);
63 if not content and extension == "lib.lua" then 65 if not content and extension == "lib.lua" then
64 content, err = load_resource(plugin, resource..".lua"); 66 content, err = load_resource(plugin, resource..".lua");
65 end 67 end
66 if not content then 68 if not content then
73 local f, err = envload(content, "@"..path, env); 75 local f, err = envload(content, "@"..path, env);
74 if not f then return f, err; end 76 if not f then return f, err; end
75 return f, path; 77 return f, path;
76 end 78 end
77 79
80 local function init(options)
81 return setmetatable({
82 _options = options or {};
83 }, pluginloader_mt);
84 end
85
86 local function bind(self, method)
87 return function (...)
88 return method(self, ...);
89 end;
90 end
91
92 local default_loader = init();
93
78 return { 94 return {
79 load_file = load_file; 95 load_file = bind(default_loader, default_loader.load_file);
80 load_resource = load_resource; 96 load_resource = bind(default_loader, default_loader.load_resource);
81 load_code = load_code; 97 load_code = bind(default_loader, default_loader.load_code);
82 load_code_ext = load_code_ext; 98 load_code_ext = bind(default_loader, default_loader.load_code_ext);
99
100 init = init;
83 }; 101 };