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 }