1 module app;
2 
3 import std.algorithm : canFind;
4 import std.json : JSONValue;
5 import std.stdio : writeln;
6 
7 import myip;
8 
9 void main(string[] args) {
10 
11 	bool public_ = args.canFind("--public");
12 	bool private_ = args.canFind("--private");
13 	bool v4 = args.canFind("--4");
14 	bool v6 = args.canFind("--6");
15 	
16 	void addImpl(ref JSONValue[string] json, string[] keys, JSONValue value) {
17 		if(keys.length == 1) json[keys[0]] = value;
18 		else {
19 			if(keys[0] !in json) json[keys[0]] = (JSONValue[string]).init;
20 			addImpl(json[keys[0]].object, keys[1..$], value);
21 		}
22 	}
23 	
24 	JSONValue[string] json;
25 	
26 	void add(T)(T value, string[] keys...) {
27 		addImpl(json, keys, JSONValue(value));
28 	}
29 	
30 	if(private_ || !public_) {
31 	
32 		if(v4 || !v6) add(privateAddresses4(), "private", "v4");
33 		if(v6 || !v4) add(privateAddresses6(!args.canFind("--interface")), "private", "v6");
34 		
35 	}
36 	
37 	if(public_ || !private_) {
38 		
39 		if(args.canFind("--all")) {
40 		
41 			foreach(member ; __traits(allMembers, Service)) {
42 				mixin("alias service = Service." ~ member ~ ";");
43 				static if(is(typeof(service) == Service)) {
44 					if(v4 || !v6) add(publicAddress4(service), "public", member, "v4");
45 					if(v6 || !v4) add(publicAddress6(service), "public", member, "v6");
46 				}
47 			}
48 		
49 		} else {
50 		
51 			if(v4 || !v6) add(publicAddress4(), "public", "v4");
52 			if(v6 || !v4) add(publicAddress6(), "public", "v6");
53 			
54 		}
55 	
56 	}
57 	
58 	if(args.canFind("--pretty")) writeln(JSONValue(json).toPrettyString());
59 	else writeln(JSONValue(json));
60 
61 }