1 /*
2  * Copyright (c) 2017-2018 sel-project
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  *
22  */
23 module starter;
24 
25 import std.algorithm : canFind;
26 import std.conv : to;
27 import std.file : exists, write, read;
28 import std.json : JSONValue, parseJSON, toJSON;
29 import std.stdio : writeln;
30 
31 import selery.about : Software;
32 import selery.config : Config;
33 
34 import config;
35 
36 void start(ConfigType type, ref string[] args, void delegate(Config) startFunction) {
37 
38 	if(args.canFind("--about") || args.canFind("-a")) {
39 
40 		import std.system : endian;
41 
42 		static if(__traits(compiles, import("notes.txt"))) {}
43 		
44 		JSONValue[string] json;
45 		json["type"] = cast(string)type;
46 		json["software"] = Software.toJSON();
47 		json["system"] = ["endian": JSONValue(cast(int)endian), "bits": JSONValue(size_t.sizeof*8)];
48 		json["build"] = ["date": JSONValue(__DATE__), "time": JSONValue(__TIME__), "timestamp": JSONValue(__TIMESTAMP__), "vendor": JSONValue(__VENDOR__), "version": JSONValue(__VERSION__)];
49 		static if(__traits(compiles, import("release.json"))) json["release"] = parseJSON(import("release.json"));
50 		else json["release"] = (JSONValue[string]).init;
51 		debug json["debug"] = true;
52 		else json["debug"] = false;
53 		auto j = JSONValue(json);
54 		writeln(toJSON(j, args.canFind("--pretty")));
55 		return;
56 
57 	} else if(args.canFind("--changelog") || args.canFind("-c")) {
58 		
59 		static if(__traits(compiles, import("notes.txt")) && __traits(compiles, import("version.txt")) && Software.displayVersion == import("version.txt")) {
60 			import std.string : replace;
61 			writeln("Release notes for ", Software.name, " ", Software.displayVersion, ":\n\n", replace(import("notes.txt"), "\\n", "\n")); //TODO remove links
62 		} else {
63 			writeln("Release notes were not included in this build.");
64 		}
65 		return;
66 		
67 	}
68 	
69 	Config config = loadConfig(type, args);
70 
71 	if(!args.canFind("--init") && !args.canFind("-i")) startFunction(config);
72 
73 }