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 }