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     binary,
63 }
64 
65 
66 struct Dirs {
67     string[] value = ["."];
68 }
69 
70 struct Files {
71     string[] value;
72 }
73 
74 struct Filter(alias F) {
75     alias func = F;
76 }
77 
78 struct SourcesImpl(alias F) {
79     Dirs dirs;
80     Files files;
81     Filter!F filter;
82 
83     alias filterFunc = F;
84 }
85 
86 auto Sources(Dirs dirs = Dirs(), Files files = Files(), F = Filter!(a => true))() {
87     return SourcesImpl!(F.func)(dirs, files);
88 }
89 
90 auto Sources(string[] dirs, Files files = Files(), F = Filter!(a => true))() {
91     return Sources!(Dirs(dirs), files, F)();
92 }