Software / code / prosody
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 |
| 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 }; |