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 {
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 alias IncludePaths = ImportPaths;
35 
36 struct StringImportPaths {
37     string[] value;
38 }
39 
40 struct SrcDirs {
41     string[] value;
42 }
43 
44 struct SrcFiles {
45     string[] value;
46 }
47 
48 struct ExcludeFiles {
49     string[] value;
50 }
51 
52 struct ExeName {
53     string value;
54 }
55 
56 struct Configuration {
57     string value = "default";
58 }
59 
60 enum Backend {
61     none,
62     make,
63     ninja,
64     tup,
65     binary,
66 }
67 
68 
69 struct Dirs {
70     string[] value = ["."];
71 }
72 
73 struct Files {
74     string[] value;
75 }
76 
77 struct Filter(alias F) {
78     alias func = F;
79 }
80 
81 struct SourcesImpl(alias F) {
82     Dirs dirs;
83     Files files;
84     Filter!F filter;
85 
86     alias filterFunc = F;
87 }
88 
89 auto Sources(Dirs dirs = Dirs(), Files files = Files(), F = Filter!(a => true))() {
90     return SourcesImpl!(F.func)(dirs, files);
91 }
92 
93 auto Sources(string[] dirs, Files files = Files(), F = Filter!(a => true))() {
94     return Sources!(Dirs(dirs), files, F)();
95 }
96 
97 struct SourceFile {
98     string value;
99 }