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 }