Diff

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
line wrap: on
line diff
--- a/util/pluginloader.lua	Thu Feb 03 12:53:19 2022 +0000
+++ b/util/pluginloader.lua	Thu Feb 03 12:56:52 2022 +0000
@@ -24,6 +24,7 @@
 
 function pluginloader_methods:load_file(names)
 	local file, err, path;
+	local load_filter_cb = self._options.load_filter_cb;
 	for i=1,#plugin_dir do
 		for j=1,#names do
 			path = plugin_dir[i]..names[j];
@@ -31,7 +32,13 @@
 			if file then
 				local content = file:read("*a");
 				file:close();
-				return content, path;
+				local metadata;
+				if load_filter_cb then
+					path, content, metadata = load_filter_cb(path, content);
+				end
+				if content and path then
+					return content, path, metadata;
+				end
 			end
 		end
 	end
@@ -39,6 +46,7 @@
 end
 
 function pluginloader_methods:load_resource(plugin, resource)
+	resource = resource or "mod_"..plugin..".lua";
 	local names = {
 		"mod_"..plugin..dir_sep..plugin..dir_sep..resource; -- mod_hello/hello/mod_hello.lua
 		"mod_"..plugin..dir_sep..resource;                  -- mod_hello/mod_hello.lua
@@ -52,21 +60,21 @@
 end
 
 function pluginloader_methods:load_code(plugin, resource, env)
-	local content, err = load_resource(plugin, resource);
+	local content, err, metadata = self:load_resource(plugin, resource);
 	if not content then return content, err; end
 	local path = err;
 	local f, err = envload(content, "@"..path, env);
 	if not f then return f, err; end
-	return f, path;
+	return f, path, metadata;
 end
 
 function pluginloader_methods:load_code_ext(plugin, resource, extension, env)
-	local content, err = load_resource(plugin, resource.."."..extension);
+	local content, err, metadata = self:load_resource(plugin, resource.."."..extension);
 	if not content and extension == "lib.lua" then
-		content, err = load_resource(plugin, resource..".lua");
+		content, err, metadata = self:load_resource(plugin, resource..".lua");
 	end
 	if not content then
-		content, err = load_resource(resource, resource.."."..extension);
+		content, err, metadata = self:load_resource(resource, resource.."."..extension);
 		if not content then
 			return content, err;
 		end