1 module mir.toml.annotations;
2 
3 import mir.serde;
4 import mir.ion.exception;
5 import mir.ion.value;
6 
7 alias tomlInlineArray = serdeTransformOut!(v => TomlInlineArray!(typeof(v))(v));
8 alias tomlInlineTable = serdeTransformOut!(v => TomlInlineTable!(typeof(v))(v));
9 alias tomlLiteralString = serdeTransformOut!(v => TomlString!(false, true)(v));
10 alias tomlMultilineString = serdeTransformOut!(v => TomlString!(true, false)(v));
11 alias tomlMultilineLiteralString = serdeTransformOut!(v => TomlString!(true, true)(v));
12 
13 struct TomlInlineTable(T)
14 {
15 	T value;
16 
17 	@safe pure scope
18 	IonException deserializeFromIon(scope const char[][] symbolTable, IonDescribedValue value)
19 	{
20 		import mir.deser.ion : deserializeIon;
21 		import mir.ion.type_code : IonTypeCode;
22 
23 		if (value.descriptor.type == IonTypeCode.struct_)
24 			cast()this.value = deserializeIon!T(symbolTable, value);
25 		else
26 			return ionException(IonErrorCode.expectedStructValue);
27 		return null;
28 	}
29 
30 	void serialize(S)(scope ref S serializer) const scope
31 	{
32 		import mir.ser : serializeValue;
33 		import mir.toml.serializer;
34 
35 		static if (is(immutable S == immutable TOMLSerializer!U, U))
36 		{
37 			bool removeFlag = serializer.pushFlag(SerializationFlag.inlineTable);
38 			scope (exit)
39 				if (removeFlag)
40 					serializer.removeFlag(SerializationFlag.inlineTable);
41 		}
42 		serializeValue(serializer, value);
43 	}
44 }
45 
46 struct TomlInlineArray(T)
47 {
48 	T value;
49 
50 	@safe pure scope
51 	IonException deserializeFromIon(scope const char[][] symbolTable, IonDescribedValue value)
52 	{
53 		import mir.deser.ion : deserializeIon;
54 		import mir.ion.type_code : IonTypeCode;
55 
56 		if (value.descriptor.type == IonTypeCode.array)
57 			cast()this.value = deserializeIon!T(symbolTable, value);
58 		else
59 			return ionException(IonErrorCode.expectedStructValue);
60 		return null;
61 	}
62 
63 	void serialize(S)(scope ref S serializer) const scope
64 	{
65 		import mir.ser : serializeValue;
66 		import mir.toml.serializer;
67 
68 		static if (is(immutable S == immutable TOMLSerializer!U, U))
69 		{
70 			bool removeFlag = serializer.pushFlag(SerializationFlag.inlineArray);
71 			scope (exit)
72 				if (removeFlag)
73 					serializer.removeFlag(SerializationFlag.inlineArray);
74 		}
75 		serializeValue(serializer, value);
76 	}
77 }
78 
79 struct TomlString(bool multiline, bool literal)
80 {
81 	string value;
82 
83 	@safe pure scope
84 	IonException deserializeFromIon(scope const char[][] symbolTable, IonDescribedValue value)
85 	{
86 		import mir.deser.ion : deserializeIon;
87 		import mir.ion.type_code : IonTypeCode;
88 
89 		if (value.descriptor.type == IonTypeCode..string)
90 			this.value = deserializeIon!T(symbolTable, value);
91 		else
92 			return ionException(IonErrorCode.expectedStringValue);
93 		return null;
94 	}
95 
96 	void serialize(S)(scope ref S serializer) const scope
97 	{
98 		import mir.ser : serializeValue;
99 		import mir.toml.serializer;
100 
101 		static if (multiline && literal)
102 			enum flag = SerializationFlag.multilineLiteralString;
103 		else static if (multiline)
104 			enum flag = SerializationFlag.multilineString;
105 		else static if (literal)
106 			enum flag = SerializationFlag.literalString;
107 		else
108 			enum flag = SerializationFlag.none;
109 
110 		static if (is(immutable S == immutable TOMLSerializer)
111 			&& flag != SerializationFlag.none)
112 		{
113 			bool removeFlag = serializer.pushFlag(flag);
114 			scope (exit)
115 				if (removeFlag)
116 					serializer.removeFlag(flag);
117 		}
118 		serializeValue(serializer, value);
119 	}
120 }