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 TargetName {
67     string value;
68 }
69 
70 struct Configuration {
71     string value = "default";
72 }
73 
74 enum Backend {
75     none,
76     make,
77     ninja,
78     tup,
79     binary,
80 }
81 
82 
83 struct Dirs {
84     string[] value = ["."];
85 }
86 
87 struct Files {
88     string[] value;
89 }
90 
91 struct Filter(alias F) {
92     alias func = F;
93 }
94 
95 struct SourcesImpl(alias F) {
96     Dirs dirs;
97     Files files;
98     Filter!F filter;
99 
100     alias filterFunc = F;
101 }
102 
103 auto Sources(Dirs dirs = Dirs(), Files files = Files(), F = Filter!(a => true))() {
104     return SourcesImpl!(F.func)(dirs, files);
105 }
106 
107 auto Sources(string[] dirs, Files files = Files(), F = Filter!(a => true))() {
108     return Sources!(Dirs(dirs), files, F)();
109 }
110 
111 auto Sources(string dir, Files files = Files(), F = Filter!(a => true))() {
112     return Sources!([dir], files, F)();
113 }
114 
115 struct SourceFile {
116     string value;
117 }