1 module mir.toml.examples;
2 
3 import core.time;
4 import mir.toml;
5 import std.conv;
6 
7 @safe
8 version(mir_toml_test) unittest
9 {
10 	import std.datetime.date;
11 	import std.datetime.systime;
12 	import std.datetime.timezone;
13 	import mir.algebraic;
14 	import mir.serde;
15 
16 	alias StringOrDouble = Algebraic!(string, double);
17 
18 	struct TempTargets
19 	{
20 		double cpu = 0;
21 		@serdeKeys("case")
22 		double case_ = 0;
23 	}
24 
25 	struct Person
26 	{
27 		string name;
28 		@serdeKeys("dob")
29 		SysTime dayOfBirth;
30 	}
31 
32 	struct Database
33 	{
34 		bool enabled;
35 		ushort[] ports;
36 		StringOrDouble[][] data;
37 		@tomlInlineTable
38 		@serdeKeys("temp_targets")
39 		TempTargets tempTargets;
40 	}
41 
42 	struct Server
43 	{
44 		string ip;
45 		string role;
46 	}
47 
48 	struct Servers
49 	{
50 		Server alpha;
51 		Server beta;
52 	}
53 
54 	struct DocumentSample
55 	{
56 		string title;
57 		Person owner;
58 		Database database;
59 		Servers servers;
60 	}
61 
62 	DocumentSample document = {
63 		title: "TOML Example",
64 		owner: Person(
65 			"Tom Preston-Werner",
66 			SysTime(DateTime(1979, 5, 27, 7, 32, 0), new immutable SimpleTimeZone(-8.hours))
67 		),
68 		database: Database(
69 			true,
70 			[8000, 8001, 8002]
71 		),
72 		servers: Servers(
73 			Server("10.0.0.1", "frontend"),
74 			Server("10.0.0.2", "backend"),
75 		)
76 	};
77 	document.database.data.length = 2;
78 	document.database.data[0] = [StringOrDouble("delta"), StringOrDouble("phi")];
79 	document.database.data[1] = [StringOrDouble(3.14)];
80 	document.database.tempTargets = TempTargets(79.5, 72.0);
81 
82 	string serialized = serializeToml(document);
83 	assert(serialized == `title = "TOML Example"
84 
85 [owner]
86 name = "Tom Preston-Werner"
87 dob = 1979-05-27T07:32:00-08:00
88 
89 [database]
90 enabled = true
91 ports = [ 8000, 8001, 8002 ]
92 data = [ [ "delta", "phi" ], [ 3.14 ] ]
93 temp_targets = { cpu = 79.5, case = 72 }
94 
95 [servers]
96 [servers.alpha]
97 ip = "10.0.0.1"
98 role = "frontend"
99 
100 [servers.beta]
101 ip = "10.0.0.2"
102 role = "backend"
103 `);
104 
105 	auto deserialized = deserializeToml!DocumentSample(serialized);
106 	assert(document == deserialized, text(document, " != ", deserialized));
107 }
108 
109 unittest
110 {
111 	import mir.serde;
112 	import mir.algebraic;
113 	import std.datetime.date;
114 
115 	alias StringOrDouble = Algebraic!(string, double);
116 
117 	struct Person
118 	{
119 		string name;
120 		@serdeKeys("dob")
121 		Date dayOfBirth;
122 	}
123 
124 	struct Database
125 	{
126 		bool enabled;
127 		ushort[] ports;
128 		StringOrDouble[][] data;
129 	}
130 
131 	struct MyDocument
132 	{
133 		// NOTE: regular members MUST come before members that are serialized as
134 		// tables or arrays of tables. (structs and struct arrays)
135 		// Otherwise an exception is thrown at runtime
136 		string title;
137 
138 		// represented as `owner = { ... }` instead of creating an `[owner]` section
139 		@tomlInlineTable
140 		Person owner;
141 
142 		Database database;
143 	}
144 
145 	MyDocument document = {
146 		title: "TOML Example",
147 		owner: Person(
148 			"Max Mustermann",
149 			Date(1979, 5, 27)
150 		),
151 		database: Database(
152 			true,
153 			[8000, 8001, 8002],
154 			[
155 				[StringOrDouble(1.4), StringOrDouble("cool")],
156 				[],
157 				[StringOrDouble("ok")]
158 			]
159 		)
160 	};
161 
162 	debug { import std.stdio : writeln; writeln("minimal doc:\n", serializeToml(document, TOMLBeautyConfig.minify)); }
163 	debug { import std.stdio : writeln; writeln("doc:\n", serializeToml(document)); }
164 	debug { import std.stdio : writeln; writeln("pretty doc:\n", serializeToml(document, TOMLBeautyConfig.full)); }
165 }