1 /** 2 * Copyright © DiamondMVC 2018 3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE) 4 * Author: Jacob Jensen (bausshf) 5 */ 6 module diamond.views.viewgenerator; 7 8 import diamond.core.apptype; 9 10 static if (!isWebApi) 11 { 12 /// Mixin template for the view generator. 13 mixin template GenerateViews() 14 { 15 import diamond.core.webconfig; 16 import diamond.views.viewparser; 17 18 /** 19 * Generates the strings of the view classes to use with mixin. 20 * Returns: 21 * An array consisting of the generated classes of the views. 22 * The first element of the array is the routable data. 23 */ 24 private string[] generateViews() 25 { 26 string[] viewGenerations = []; 27 28 string routableViewsMixin = "private static __gshared string[string] _routableViews; 29 @property string[string] routableViews() 30 { 31 if (_routableViews) return _routableViews; 32 "; 33 34 mixin LoadViewData; 35 36 foreach (viewName,viewContent; getViewData) 37 { 38 import diamond.templates.parser : parseTemplate; 39 40 auto parts = parseTemplate(viewContent); 41 42 string route; 43 viewGenerations ~= parseViewParts(parts, viewName, route); 44 45 if (route && route.length) 46 { 47 import std..string : format; 48 routableViewsMixin ~= "_routableViews[\"%s\"] = \"%s\";".format(route, viewName); 49 } 50 } 51 52 routableViewsMixin ~= "return _routableViews; 53 }"; 54 55 return [routableViewsMixin] ~ viewGenerations; 56 } 57 58 /// The result of the generated views. 59 enum generateViewsResult = generateViews(); 60 } 61 }