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 }