1 /** 2 Copyright: Copyright (c) 2015-2018 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 module pluginlib.plugininforeader; 7 8 import voxelman.log; 9 import pluginlib; 10 11 enum pluguinPackFolder = `../../pluginpacks`; 12 13 auto filterEnabledPlugins(Plugins)(Plugins plugins, ref string[] args) 14 { 15 import std.getopt; 16 import std.file; 17 import std.range; 18 import std.algorithm; 19 import std.string : format; 20 21 string packName; 22 string packId; 23 24 auto helpInformation = getopt(args, 25 std.getopt.config.passThrough, 26 "pack", &packId); 27 28 if (packId.length == 0) 29 packId = "default"; 30 31 packName = format("%s/%s.txt", pluguinPackFolder, packId); 32 33 PluginInfo*[string] packPlugins; 34 if (exists(packName)) 35 { 36 string fileData = cast(string)read(packName); 37 PluginPack* pack = readPluginPack(fileData); 38 foreach(plug; pack.plugins) 39 packPlugins[plug.id] = plug; 40 infof("Found %s plugins in '%s' pack", packPlugins.length, pack.id); 41 } 42 else 43 infof("Cannot load: %s", packName); 44 45 return plugins.filter!(p => p.id in packPlugins); 46 } 47 48 struct PluginInfo 49 { 50 string id; 51 string semver; 52 string downloadUrl; 53 PluginInfo*[] dependencies; 54 PluginInfo*[] dependants; 55 } 56 57 struct PluginPack 58 { 59 string id; 60 string semver; 61 string filename; 62 PluginInfo*[] plugins; 63 } 64 65 PluginInfo* readPluginInfo(string fileData) 66 { 67 import std.regex : matchFirst, regex; 68 69 auto pinfo = new PluginInfo; 70 71 auto idCapture = matchFirst(fileData, regex(`id\s*=\s*"(?P<id>[^"]*)"`, "s")); 72 pinfo.id = idCapture["id"].idup; 73 74 auto semverCapture = matchFirst(fileData, regex(`semver\s*=\s*"(?P<semver>[^"]*)"`, "s")); 75 pinfo.semver = semverCapture["semver"].idup; 76 77 return pinfo; 78 } 79 80 PluginPack* readPluginPack(string fileData) 81 { 82 import std.algorithm : startsWith; 83 import std.array : empty; 84 import std.regex : matchFirst, regex; 85 import std.string : lineSplitter; 86 87 auto pack = new PluginPack; 88 89 auto input = fileData.lineSplitter; 90 91 if (!input.empty) { 92 auto packInfo = matchFirst(input.front, regex(`(?P<id>[^\s]*)\s+(?P<semver>.*)`, "m")); 93 pack.id = packInfo["id"].idup; 94 pack.semver = packInfo["semver"].idup; 95 input.popFront; 96 } 97 98 foreach(line; input) 99 { 100 if (line.empty || startsWith(line, "#")) 101 continue; 102 103 auto pluginInfo = matchFirst(line, regex(`(?P<id>[^\s]*)\s+(?P<semver>.*)`, "m")); 104 auto pinfo = new PluginInfo; 105 pinfo.id = pluginInfo["id"].idup; 106 pinfo.semver = pluginInfo["semver"].idup; 107 pack.plugins ~= pinfo; 108 } 109 110 return pack; 111 }