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 }