1 /** 2 * Copyright © DiamondMVC 2019 3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE) 4 * Author: Jacob Jensen (bausshf) 5 */ 6 module diamond.core.webinitialization; 7 8 import diamond.core.apptype; 9 10 static if (isWebApi) 11 { 12 /** 13 * Generates the global view data. 14 * Returns: 15 * A string containing all global view data such as imports etc. 16 */ 17 string generateGlobalView() 18 { 19 string content; 20 21 import diamond.core.io : handleCTFEFile; 22 23 mixin handleCTFEFile!("globalview.d", q{ 24 content = __fileResult; 25 }); 26 handle(); 27 28 return content ? content : ""; 29 } 30 31 /** 32 * Generates the controller data. 33 * Returns: 34 * An array with the names of the controllers to handle. 35 */ 36 string[] generateControllerData() 37 { 38 import std.array : replace, split, array; 39 import std..string : strip; 40 import std.algorithm : filter; 41 42 string[] controllers; 43 44 import diamond.core.io : handleCTFEFile; 45 46 mixin handleCTFEFile!("controllers.config", q{ 47 controllers = __fileResult.replace("\r", "").split("\n").filter!(c => c && c.strip().length).array; 48 }); 49 handle(); 50 51 return controllers ? controllers : []; 52 } 53 } 54 55 static if (isWebServer) 56 { 57 /// Mixin template to load view data (name + content) 58 mixin template LoadViewData(bool namesOnly = false) 59 { 60 /// Generates the functon "getViewData()" which gives you an AA like content[viewName] 61 private string generateViewData() 62 { 63 string viewDataString = "string[string] getViewData() 64 { 65 string[string] viewData; 66 "; 67 68 static if (__traits(compiles, { auto s = import("views.config"); })) 69 { 70 import std..string : strip; 71 import std.array : split, replace; 72 73 enum viewConfig = import("views.config"); 74 75 foreach (line; viewConfig.split("\n")) 76 { 77 if (!line) 78 { 79 continue; 80 } 81 82 line = line.strip().replace("\r", ""); 83 84 if (!line && line.length) 85 { 86 continue; 87 } 88 89 auto data = line.split("."); 90 91 if (data.length != 2) 92 { 93 continue; 94 } 95 96 static if (namesOnly) 97 { 98 auto viewName = data[0].strip(); 99 100 viewDataString ~= " viewData[\"" ~ viewName ~ "\"] = \"" ~ viewName ~ "\";"; 101 } 102 else 103 { 104 viewDataString ~= " viewData[\"" ~ data[0].strip() ~ "\"] = import(\"" ~ (data[0].strip() ~ "." ~ data[1].strip()) ~ "\");"; 105 } 106 } 107 } 108 109 viewDataString ~= " return viewData; 110 }"; 111 112 return viewDataString; 113 } 114 115 mixin(generateViewData); 116 } 117 }