1 //Argument parsing and other mess 2 module util.argparse; 3 import util.inform; 4 import util.config; 5 import util.statman; 6 import std.stdio; 7 import std.getopt; 8 import std.file; 9 import std.algorithm; 10 11 ///Ugly argument parsing, no attempt at abstraction 12 int argParse(string[] args) 13 { 14 StatManager* result; 15 //Skip exe location 16 size_t stat = 1; 17 string curTok(size_t tmp = stat) 18 in(stat <= args.length, "Index out of bounds, no more arguments") 19 { 20 return args[tmp]; 21 } 22 23 bool accept(string tmp) 24 { 25 26 if (stat == args.length) 27 return false; 28 if (args[stat] == tmp) 29 { 30 ++stat; 31 return true; 32 } 33 else 34 { 35 return false; 36 } 37 } 38 //Config to use 39 string configName = ""; 40 string spitItOut; 41 bool useJson; 42 43 auto optResult = getopt(args, config.passThrough, "j|json", &useJson, 44 "c|config", &configName, "o|output", &spitItOut); 45 46 //This pattern can be made into a uda at some point but the interface isn't fixed yet 47 48 //Counter doesn't need a config file 49 if (accept("counter")) 50 { 51 import commands.featurecount : command; 52 53 try 54 { 55 result = command(args); 56 57 } 58 catch (Exception e) 59 { 60 inform(e.msg); 61 } 62 63 } 64 65 //Everything needing config file goes past here 66 if (!exists("bq.json")) 67 alert("No config file found"); 68 69 const config = loadConfig("bq.json"); 70 while (configName == "") 71 { 72 import std..string : strip; 73 74 writeln("Specify a configuration name"); 75 configName = readln().strip; 76 77 } 78 79 //Print some information about the loaded configurations 80 { 81 writef!"%d Configurations loaded\n"(config.rawBuilds.length); 82 config.rawBuilds 83 .map!(x => x.name) 84 .each!(x => writef!"* %s\n"(x)); 85 86 } 87 const build = config.getBuildByString(configName); 88 89 if (accept("outwatch")) 90 { 91 import commands.outwatch : command; 92 93 try 94 { 95 return command(build); 96 } 97 catch (Exception e) 98 { 99 ("outwatch exception thrown: " ~ e.msg).alert; 100 } 101 } 102 103 if (accept("build")) 104 { 105 import commands.justbuild : command; 106 107 result = command(build, args); 108 109 } 110 111 if (accept("memory")) 112 { 113 import commands.memory : command; 114 115 result = command(build, args); 116 } 117 if (result) 118 { 119 string buf; 120 if (useJson) 121 { 122 buf = result.getJSON.toPrettyString; 123 124 } 125 else 126 { 127 buf = result.prettyString; 128 } 129 if (spitItOut != "") 130 { 131 if (exists(spitItOut)) 132 { 133 alert("Output file already exists"); 134 } 135 else 136 { 137 import util.colour; 138 139 auto g = File(spitItOut, "w"); 140 toggleColour; 141 scope (exit) 142 toggleColour; 143 g.write(buf); 144 } 145 } else { 146 buf.writeln; 147 } 148 149 } 150 alert("No valid command given!"); 151 return 1; 152 }