1 module inochi2d.fmt.serialize; 2 import inochi2d.core; 3 import std.json; 4 public import fghj; 5 public import inochi2d.math.serialization; 6 7 import std.array : appender, Appender; 8 import std.functional : forward; 9 import std.range.primitives : put; 10 11 /** 12 Interface for classes that can be serialized to JSON with custom code 13 */ 14 interface ISerializable { 15 /** 16 Custom serializer function 17 */ 18 void serialize(S)(ref S serializer); 19 } 20 21 /** 22 Interface for classes that can be deserialized to JSON with custom code 23 */ 24 interface IDeserializable(T) { 25 26 /** 27 Custom deserializer function 28 */ 29 static T deserialize(Fghj data); 30 } 31 32 /** 33 Tells serializer to ignore 34 */ 35 alias Ignore = serdeIgnore; 36 37 /** 38 Tells serializer that a key is optional 39 */ 40 alias Optional = serdeOptional; 41 42 /** 43 Sets the name of a key. 44 45 First key is JSON key name, second is human-readable name 46 */ 47 alias Name = serdeKeys; 48 49 /** 50 Loads JSON data from memory 51 */ 52 T inLoadJsonData(T)(string file) { 53 return inLoadJsonDataFromMemory(readText(file)); 54 } 55 56 57 /** 58 Loads JSON data from memory 59 */ 60 T inLoadJsonDataFromMemory(T)(string data) { 61 return deserialize!T(parseJson(cast(string)data)); 62 } 63 64 /** 65 Serialize item with compact Inochi2D JSON serializer 66 */ 67 string inToJson(T)(T item) { 68 auto app = appender!(char[]); 69 auto serializer = inCreateCompactSerializer(app); 70 serializer.serializeValue(item); 71 serializer.flush(); 72 return cast(string)app.data; 73 } 74 75 /** 76 Serialize item with pretty Inochi2D JSON serializer 77 */ 78 string inToJsonPretty(T)(T item) { 79 auto app = appender!(char[]); 80 auto serializer = inCreatePrettySerializer(app); 81 serializer.serializeValue(item); 82 serializer.flush(); 83 return cast(string)app.data; 84 } 85 86 /** 87 Creates a pretty-serializer 88 */ 89 InochiSerializer inCreatePrettySerializer(Appender!(char[]) app) { 90 return InochiSerializer((const(char)[] chars) => put(app, chars)); 91 } 92 93 /** 94 Creates a pretty-serializer 95 */ 96 InochiSerializerCompact inCreateCompactSerializer(Appender!(char[]) app) { 97 return InochiSerializerCompact((const(char)[] chars) => put(app, chars)); 98 } 99 100 alias InochiSerializer = JsonSerializer!("\t", void delegate(const(char)[]) pure nothrow @safe); 101 alias InochiSerializerCompact = JsonSerializer!("", void delegate(const(char)[]) pure nothrow @safe); 102 103 string getString(Fghj data) { 104 105 auto app = appender!(char[]); 106 data.toString((const(char)[] chars) => put(app, chars)); 107 return cast(string)app.data; 108 }