1 module dinu.cli; 2 3 4 import 5 std.conv, 6 std.stdio, 7 std.string, 8 dinu.draw; 9 10 11 12 void fill(T)(ref T object, string[] args){ 13 void delegate(string)[string] setters; 14 void delegate()[string] settersBool; 15 foreach(member; __traits(allMembers, T)) { 16 foreach(attr; __traits(getAttributes, mixin("object."~member))){ 17 static if(is(typeof(mixin("object."~member)) == bool)){ 18 settersBool[attr] = (){ mixin("object." ~ member ~ " = !object." ~ member ~ ";"); }; 19 if(member != "-" ~ attr) 20 settersBool["--" ~ member] = settersBool[attr]; 21 }else{ 22 static if(is(typeof(mixin("object."~member)) == float[3])) 23 setters[attr] = (string s){ mixin("object." ~ member ~ " = s.color;"); }; 24 else 25 setters[attr] = (string s){ mixin("object." ~ member ~ " = s.to!(typeof(T." ~ member ~ "));"); }; 26 if(member != "-" ~ attr) 27 setters["--" ~ member] = setters[attr]; 28 } 29 } 30 } 31 void delegate(string) nextSetter; 32 string nextParamName; 33 try { 34 foreach(arg; args[1..$]){ 35 try { 36 if(nextSetter){ 37 nextSetter(arg); 38 nextSetter = null; 39 }else if(arg in settersBool){ 40 settersBool[arg](); 41 }else if(arg in setters){ 42 nextSetter = setters[arg]; 43 nextParamName = arg; 44 }else{ 45 throw new Exception ("Unknown argument"); 46 } 47 }catch(Exception e){ 48 throw new Exception("Error in \"" ~ (nextSetter ? nextParamName ~ " " ~ arg : arg) ~ "\": " ~ e.msg); 49 } 50 } 51 if(nextSetter) 52 throw new Exception("Missing parameter to argument \"" ~ nextParamName ~ "\""); 53 }catch(Throwable e){ 54 usage(object); 55 throw e; 56 } 57 } 58 59 void usage(T)(T object){ 60 writeln("options: "); 61 foreach(member; __traits(allMembers, T)) 62 foreach(attr; __traits(getAttributes, mixin("object."~member))){ 63 if(attr == "-" ~ member) 64 writeln("\t%s: %s".format(attr, mixin("typeof(object." ~ member ~ ").stringof"))); 65 else 66 writeln("\t%s --%s: %s".format(attr, member, mixin("typeof(object." ~ member ~ ").stringof"))); 67 } 68 }