Skip to content

Commit 7f07dde

Browse files
fix(client): handle root bodies in requests properly
1 parent bfb615b commit 7f07dde

File tree

7 files changed

+202
-144
lines changed

7 files changed

+202
-144
lines changed

src/Orb/Core/JsonDictionary.cs

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,7 @@ public T GetNotNullClass<T>(string key)
9494
{
9595
throw new OrbInvalidDataException($"'{key}' cannot be absent");
9696
}
97-
T deserialized;
98-
try
99-
{
100-
deserialized =
101-
JsonSerializer.Deserialize<T>(element, ModelBase.SerializerOptions)
102-
?? throw new OrbInvalidDataException($"'{key}' cannot be null");
103-
}
104-
catch (JsonException e)
105-
{
106-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
107-
}
97+
T deserialized = WrappedJsonSerializer.GetNotNullClass<T>(element, key);
10898
_deserializedData[key] = deserialized;
10999
return deserialized;
110100
}
@@ -120,17 +110,7 @@ public T GetNotNullStruct<T>(string key)
120110
{
121111
throw new OrbInvalidDataException($"'{key}' cannot be absent");
122112
}
123-
T deserialized;
124-
try
125-
{
126-
deserialized =
127-
JsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions)
128-
?? throw new OrbInvalidDataException($"'{key}' cannot be null");
129-
}
130-
catch (JsonException e)
131-
{
132-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
133-
}
113+
T deserialized = WrappedJsonSerializer.GetNotNullStruct<T>(element, key);
134114
_deserializedData[key] = deserialized;
135115
return deserialized;
136116
}
@@ -147,15 +127,7 @@ public T GetNotNullStruct<T>(string key)
147127
_deserializedData[key] = null;
148128
return null;
149129
}
150-
T? deserialized;
151-
try
152-
{
153-
deserialized = JsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions);
154-
}
155-
catch (JsonException e)
156-
{
157-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
158-
}
130+
T? deserialized = WrappedJsonSerializer.GetNullableClass<T>(element, key);
159131
_deserializedData[key] = deserialized;
160132
return deserialized;
161133
}
@@ -172,15 +144,7 @@ public T GetNotNullStruct<T>(string key)
172144
_deserializedData[key] = null;
173145
return null;
174146
}
175-
T? deserialized;
176-
try
177-
{
178-
deserialized = JsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions);
179-
}
180-
catch (JsonException e)
181-
{
182-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
183-
}
147+
T? deserialized = WrappedJsonSerializer.GetNullableStruct<T>(element, key);
184148
_deserializedData[key] = deserialized;
185149
return deserialized;
186150
}

src/Orb/Core/MultipartJsonDictionary.cs

Lines changed: 4 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,7 @@ public T GetNotNullClass<T>(string key)
9797
{
9898
throw new OrbInvalidDataException($"'{key}' cannot be absent");
9999
}
100-
T deserialized;
101-
try
102-
{
103-
deserialized =
104-
MultipartJsonSerializer.Deserialize<T>(element, ModelBase.SerializerOptions)
105-
?? throw new OrbInvalidDataException($"'{key}' cannot be null");
106-
}
107-
catch (JsonException e)
108-
{
109-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
110-
}
100+
T? deserialized = WrappedMultipartJsonSerializer.GetNotNullClass<T>(element, key);
111101
_deserializedData[key] = deserialized;
112102
return deserialized;
113103
}
@@ -123,17 +113,7 @@ public T GetNotNullStruct<T>(string key)
123113
{
124114
throw new OrbInvalidDataException($"'{key}' cannot be absent");
125115
}
126-
T deserialized;
127-
try
128-
{
129-
deserialized =
130-
MultipartJsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions)
131-
?? throw new OrbInvalidDataException($"'{key}' cannot be null");
132-
}
133-
catch (JsonException e)
134-
{
135-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
136-
}
116+
T deserialized = WrappedMultipartJsonSerializer.GetNotNullStruct<T>(element, key);
137117
_deserializedData[key] = deserialized;
138118
return deserialized;
139119
}
@@ -150,18 +130,7 @@ public T GetNotNullStruct<T>(string key)
150130
_deserializedData[key] = null;
151131
return null;
152132
}
153-
T? deserialized;
154-
try
155-
{
156-
deserialized = MultipartJsonSerializer.Deserialize<T?>(
157-
element,
158-
ModelBase.SerializerOptions
159-
);
160-
}
161-
catch (JsonException e)
162-
{
163-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
164-
}
133+
T? deserialized = WrappedMultipartJsonSerializer.GetNullableClass<T>(element, key);
165134
_deserializedData[key] = deserialized;
166135
return deserialized;
167136
}
@@ -178,18 +147,7 @@ public T GetNotNullStruct<T>(string key)
178147
_deserializedData[key] = null;
179148
return null;
180149
}
181-
T? deserialized;
182-
try
183-
{
184-
deserialized = MultipartJsonSerializer.Deserialize<T?>(
185-
element,
186-
ModelBase.SerializerOptions
187-
);
188-
}
189-
catch (JsonException e)
190-
{
191-
throw new OrbInvalidDataException($"'{key}' must be of type {typeof(T).FullName}", e);
192-
}
150+
T? deserialized = WrappedMultipartJsonSerializer.GetNullableStruct<T>(element, key);
193151
_deserializedData[key] = deserialized;
194152
return deserialized;
195153
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using System.Text.Json;
2+
using Orb.Exceptions;
3+
4+
namespace Orb.Core;
5+
6+
/// <summary>
7+
/// Helper class for deserializing &lt;c&gt;JsonElement&lt;/c&gt; objects. This handles
8+
/// edge-cases around nullability and reference/value types.
9+
/// </summary>
10+
sealed class WrappedJsonSerializer
11+
{
12+
public static T GetNotNullClass<T>(JsonElement element, string name)
13+
where T : class
14+
{
15+
T deserialized;
16+
try
17+
{
18+
deserialized =
19+
JsonSerializer.Deserialize<T>(element, ModelBase.SerializerOptions)
20+
?? throw new OrbInvalidDataException($"'{name}' cannot be null");
21+
}
22+
catch (JsonException e)
23+
{
24+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
25+
}
26+
return deserialized;
27+
}
28+
29+
public static T GetNotNullStruct<T>(JsonElement element, string name)
30+
where T : struct
31+
{
32+
T deserialized;
33+
try
34+
{
35+
deserialized =
36+
JsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions)
37+
?? throw new OrbInvalidDataException($"'{name}' cannot be null");
38+
}
39+
catch (JsonException e)
40+
{
41+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
42+
}
43+
return deserialized;
44+
}
45+
46+
public static T? GetNullableClass<T>(JsonElement element, string name)
47+
where T : class
48+
{
49+
T? deserialized;
50+
try
51+
{
52+
deserialized = JsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions);
53+
}
54+
catch (JsonException e)
55+
{
56+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
57+
}
58+
return deserialized;
59+
}
60+
61+
public static T? GetNullableStruct<T>(JsonElement element, string name)
62+
where T : struct
63+
{
64+
T? deserialized;
65+
try
66+
{
67+
deserialized = JsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions);
68+
}
69+
catch (JsonException e)
70+
{
71+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
72+
}
73+
return deserialized;
74+
}
75+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System.Text.Json;
2+
using Orb.Exceptions;
3+
4+
namespace Orb.Core;
5+
6+
/// <summary>
7+
/// Helper class for deserializing &lt;c&gt;MultipartJsonElement&lt;/c&gt; objects.
8+
/// This handles edge-cases around nullability and reference/value types.
9+
/// </summary>
10+
sealed class WrappedMultipartJsonSerializer
11+
{
12+
public static T GetNotNullClass<T>(MultipartJsonElement element, string name)
13+
where T : class
14+
{
15+
T deserialized;
16+
try
17+
{
18+
deserialized =
19+
MultipartJsonSerializer.Deserialize<T>(element, ModelBase.SerializerOptions)
20+
?? throw new OrbInvalidDataException($"'{name}' cannot be null");
21+
}
22+
catch (JsonException e)
23+
{
24+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
25+
}
26+
return deserialized;
27+
}
28+
29+
public static T GetNotNullStruct<T>(MultipartJsonElement element, string name)
30+
where T : struct
31+
{
32+
T deserialized;
33+
try
34+
{
35+
deserialized =
36+
MultipartJsonSerializer.Deserialize<T?>(element, ModelBase.SerializerOptions)
37+
?? throw new OrbInvalidDataException($"'{name}' cannot be null");
38+
}
39+
catch (JsonException e)
40+
{
41+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
42+
}
43+
return deserialized;
44+
}
45+
46+
public static T? GetNullableClass<T>(MultipartJsonElement element, string name)
47+
where T : class
48+
{
49+
T? deserialized;
50+
try
51+
{
52+
deserialized = MultipartJsonSerializer.Deserialize<T?>(
53+
element,
54+
ModelBase.SerializerOptions
55+
);
56+
}
57+
catch (JsonException e)
58+
{
59+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
60+
}
61+
return deserialized;
62+
}
63+
64+
public static T? GetNullableStruct<T>(MultipartJsonElement element, string name)
65+
where T : struct
66+
{
67+
T? deserialized;
68+
try
69+
{
70+
deserialized = MultipartJsonSerializer.Deserialize<T?>(
71+
element,
72+
ModelBase.SerializerOptions
73+
);
74+
}
75+
catch (JsonException e)
76+
{
77+
throw new OrbInvalidDataException($"'{name}' must be of type {typeof(T).FullName}", e);
78+
}
79+
return deserialized;
80+
}
81+
}

0 commit comments

Comments
 (0)