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 }