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 @safe:
9 
10 struct SourceFileName {
11     string value;
12 }
13 
14 struct BinaryFileName {
15     string value;
16 }
17 
18 struct App {
19     SourceFileName srcFileName;
20     BinaryFileName exeFileName;
21 
22     this(SourceFileName srcFileName) pure {
23         immutable stripped = srcFileName.value.baseName.stripExtension;
24         immutable exeFileName = BinaryFileName(exeExt == "" ? stripped : stripped.defaultExtension(exeExt));
25 
26         this(srcFileName, exeFileName);
27     }
28 
29     this(SourceFileName srcFileName, BinaryFileName exeFileName) @safe pure nothrow {
30         this.srcFileName = srcFileName;
31         this.exeFileName = exeFileName;
32     }
33 }
34 
35 
36 struct Flags {
37     string value;
38 }
39 
40 struct ImportPaths {
41     string[] value;
42 }
43 
44 alias IncludePaths = ImportPaths;
45 
46 struct StringImportPaths {
47     string[] value;
48 }
49 
50 struct SrcDirs {
51     string[] value;
52 }
53 
54 struct SrcFiles {
55     string[] value;
56 }
57 
58 struct ExcludeFiles {
59     string[] value;
60 }
61 
62 struct ExeName {
63     string value;
64 }
65 
66 struct Configuration {
67     string value = "default";
68 }
69 
70 enum Backend {
71     none,
72     make,
73     ninja,
74     tup,
75     binary,
76 }
77 
78 
79 struct Dirs {
80     string[] value = ["."];
81 }
82 
83 struct Files {
84     string[] value;
85 }
86 
87 struct Filter(alias F) {
88     alias func = F;
89 }
90 
91 struct SourcesImpl(alias F) {
92     Dirs dirs;
93     Files files;
94     Filter!F filter;
95 
96     alias filterFunc = F;
97 }
98 
99 auto Sources(Dirs dirs = Dirs(), Files files = Files(), F = Filter!(a => true))() {
100     return SourcesImpl!(F.func)(dirs, files);
101 }
102 
103 auto Sources(string[] dirs, Files files = Files(), F = Filter!(a => true))() {
104     return Sources!(Dirs(dirs), files, F)();
105 }
106 
107 struct SourceFile {
108     string value;
109 }