1 /++
2 $(H4 High level JSON deserialization API)
3 
4 Macros:
5 IONREF = $(REF_ALTTEXT $(TT $2), $2, mir, ion, $1)$(NBSP)
6 +/
7 module mir.deser.json;
8 
9 public import mir.serde;
10 
11 private enum dip1000 = __traits(compiles, ()@nogc { throw new Exception(""); });
12 
13 /++
14 Deserialize JSON string to a type trying to do perform less memort allocations.
15 +/
16 template deserializeJson(T)
17 {
18     T deserializeJson()(scope const(char)[] text)
19     {
20         version (LDC) pragma(inline, true);
21         T value;
22         deserializeJson(value, text);
23         return value;
24     }
25 
26     void deserializeJson(scope ref T value, scope const(char)[] text)
27     {
28         version (LDC) pragma(inline, true);
29         import mir.ion.internal.stage3;
30         import mir.deser.ion: deserializeIon;
31         import mir.ion.exception: ionException, ionErrorMsg, IonParserMirException;
32 
33         auto callback(IonErrorInfo error, scope const ubyte[] data)
34         {
35             enum nogc = __traits(compiles, (scope ref T value, const(ubyte)[] data)@nogc { deserializeIon!T(value, data); });
36             if (error.code)
37             {
38                 static if (!nogc || dip1000)
39                 {
40                     throw new IonParserMirException(error.code.ionErrorMsg, error.location);
41                 }
42                 else
43                 {
44                     throw error.code.ionException;
45                 }
46             }
47             deserializeIon!T(value, data);
48         }
49 
50         mir_json2ion(text, &callback);
51     }
52 }
53 
54 deprecated ("Use deserializeJson instead")
55 alias deserializeDynamicJson = deserializeJson;