Software /
code /
prosody
Comparison
util/pluginloader.lua @ 12251:21ed12cfe300
util.pluginloader: Support for a per-file load filter
Load filters can choose to block the loading of certain files, and optionally
return some metadata about the loaded file.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 03 Feb 2022 12:56:52 +0000 |
parent | 12250:e157e5c79daa |
child | 12255:a3ad9cf740d6 |
comparison
equal
deleted
inserted
replaced
12250:e157e5c79daa | 12251:21ed12cfe300 |
---|---|
22 local pluginloader_methods = {}; | 22 local pluginloader_methods = {}; |
23 local pluginloader_mt = { __index = pluginloader_methods }; | 23 local pluginloader_mt = { __index = pluginloader_methods }; |
24 | 24 |
25 function pluginloader_methods:load_file(names) | 25 function pluginloader_methods:load_file(names) |
26 local file, err, path; | 26 local file, err, path; |
27 local load_filter_cb = self._options.load_filter_cb; | |
27 for i=1,#plugin_dir do | 28 for i=1,#plugin_dir do |
28 for j=1,#names do | 29 for j=1,#names do |
29 path = plugin_dir[i]..names[j]; | 30 path = plugin_dir[i]..names[j]; |
30 file, err = io_open(path); | 31 file, err = io_open(path); |
31 if file then | 32 if file then |
32 local content = file:read("*a"); | 33 local content = file:read("*a"); |
33 file:close(); | 34 file:close(); |
34 return content, path; | 35 local metadata; |
36 if load_filter_cb then | |
37 path, content, metadata = load_filter_cb(path, content); | |
38 end | |
39 if content and path then | |
40 return content, path, metadata; | |
41 end | |
35 end | 42 end |
36 end | 43 end |
37 end | 44 end |
38 return file, err; | 45 return file, err; |
39 end | 46 end |
40 | 47 |
41 function pluginloader_methods:load_resource(plugin, resource) | 48 function pluginloader_methods:load_resource(plugin, resource) |
49 resource = resource or "mod_"..plugin..".lua"; | |
42 local names = { | 50 local names = { |
43 "mod_"..plugin..dir_sep..plugin..dir_sep..resource; -- mod_hello/hello/mod_hello.lua | 51 "mod_"..plugin..dir_sep..plugin..dir_sep..resource; -- mod_hello/hello/mod_hello.lua |
44 "mod_"..plugin..dir_sep..resource; -- mod_hello/mod_hello.lua | 52 "mod_"..plugin..dir_sep..resource; -- mod_hello/mod_hello.lua |
45 plugin..dir_sep..resource; -- hello/mod_hello.lua | 53 plugin..dir_sep..resource; -- hello/mod_hello.lua |
46 resource; -- mod_hello.lua | 54 resource; -- mod_hello.lua |
50 | 58 |
51 return self:load_file(names); | 59 return self:load_file(names); |
52 end | 60 end |
53 | 61 |
54 function pluginloader_methods:load_code(plugin, resource, env) | 62 function pluginloader_methods:load_code(plugin, resource, env) |
55 local content, err = load_resource(plugin, resource); | 63 local content, err, metadata = self:load_resource(plugin, resource); |
56 if not content then return content, err; end | 64 if not content then return content, err; end |
57 local path = err; | 65 local path = err; |
58 local f, err = envload(content, "@"..path, env); | 66 local f, err = envload(content, "@"..path, env); |
59 if not f then return f, err; end | 67 if not f then return f, err; end |
60 return f, path; | 68 return f, path, metadata; |
61 end | 69 end |
62 | 70 |
63 function pluginloader_methods:load_code_ext(plugin, resource, extension, env) | 71 function pluginloader_methods:load_code_ext(plugin, resource, extension, env) |
64 local content, err = load_resource(plugin, resource.."."..extension); | 72 local content, err, metadata = self:load_resource(plugin, resource.."."..extension); |
65 if not content and extension == "lib.lua" then | 73 if not content and extension == "lib.lua" then |
66 content, err = load_resource(plugin, resource..".lua"); | 74 content, err, metadata = self:load_resource(plugin, resource..".lua"); |
67 end | 75 end |
68 if not content then | 76 if not content then |
69 content, err = load_resource(resource, resource.."."..extension); | 77 content, err, metadata = self:load_resource(resource, resource.."."..extension); |
70 if not content then | 78 if not content then |
71 return content, err; | 79 return content, err; |
72 end | 80 end |
73 end | 81 end |
74 local path = err; | 82 local path = err; |