1 module reggae.types;
2 
3 import reggae.rules.common: exeExt;
4 import std.path: baseName, stripExtension, defaultExtension;
5 
6 //Wrapper structs to ensure type-safety and readability
7 
8 struct App {
9     string srcFileName;
10     string exeFileName;
11 
12     this(string srcFileName) @safe pure nothrow {
13         immutable stripped = srcFileName.baseName.stripExtension;
14         immutable exeFileName =  exeExt == "" ? stripped : stripped.defaultExtension(exeExt);
15 
16         this(srcFileName, exeFileName);
17     }
18 
19     this(string srcFileName, string exeFileName) @safe pure nothrow {
20         this.srcFileName = srcFileName;
21         this.exeFileName = exeFileName;
22     }
23 }
24 
25 
26 struct Flags {
27     string value;
28 }
29 
30 struct ImportPaths {
31     string[] value;
32 }
33 
34 struct StringImportPaths {
35     string[] value;
36 }
37 
38 struct SrcDirs {
39     string[] value;
40 }
41 
42 struct SrcFiles {
43     string[] value;
44 }
45 
46 struct ExcludeFiles {
47     string[] value;
48 }
49 
50 struct ExeName {
51     string value;
52 }
53 
54 struct Configuration {
55     string value = "default";
56 }
57 
58 enum Backend {
59     none,
60     make,
61     ninja,
62     tup,
63     binary,
64 }
65 
66 
67 struct Dirs {
68     string[] value = ["."];
69 }
70 
71 struct Files {
72     string[] value;
73 }
74 
75 struct Filter(alias F) {
76     alias func = F;
77 }
78 
79 struct SourcesImpl(alias F) {
80     Dirs dirs;
81     Files files;
82     Filter!F filter;
83 
84     alias filterFunc = F;
85 }
86 
87 auto Sources(Dirs dirs = Dirs(), Files files = Files(), F = Filter!(a => true))() {
88     return SourcesImpl!(F.func)(dirs, files);
89 }
90 
91 auto Sources(string[] dirs, Files files = Files(), F = Filter!(a => true))() {
92     return Sources!(Dirs(dirs), files, F)();
93 }