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 }