haste_fhir_model/r4/datetime/
serialize.rs1use crate::r4::datetime::{
2 Date, DateTime, Instant, Time, parse_date, parse_datetime, parse_instant, parse_time,
3};
4use haste_fhir_serialization_json::errors::DeserializeError;
5use haste_fhir_serialization_json::{Context, SerializeError};
6use haste_fhir_serialization_json::{FHIRJSONDeserializer, FHIRJSONSerializer};
7use serde::Deserialize;
8use serde_json::Value;
9
10fn get_value<'a>(value: &'a Value, context: &Context) -> Option<&'a Value> {
11 match context {
12 Context::AsValue => Some(value),
13 Context::AsField(field_context) => value.get(field_context.field),
14 }
15}
16
17impl<'de> Deserialize<'de> for DateTime {
18 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
19 where
20 D: serde::Deserializer<'de>,
21 {
22 let value = String::deserialize(deserializer)?;
23 parse_datetime(&value).map_err(|_| serde::de::Error::custom("invalid FHIR dateTime"))
24 }
25}
26
27impl serde::Serialize for DateTime {
28 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
29 where
30 S: serde::Serializer,
31 {
32 self.to_string().serialize(serializer)
33 }
34}
35
36impl FHIRJSONDeserializer for DateTime {
37 fn from_json_str(
38 s: &str,
39 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
40 let mut json_value: Value = serde_json::from_str(s)?;
41 DateTime::from_serde_value(&mut json_value, Context::AsValue)
42 }
43
44 fn from_serde_value(
45 value: *mut Value,
46 context: haste_fhir_serialization_json::Context,
47 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
48 let value = unsafe { &mut *(value as *mut Value) };
49 let k = get_value(&value, &context)
50 .and_then(|v| v.as_str().and_then(|v| parse_datetime(v).ok()));
51 k.ok_or_else(|| DeserializeError::FailedToConvertType("DateTime".to_string()))
52 }
53}
54
55impl FHIRJSONSerializer for DateTime {
56 fn serialize_value(&self, writer: &mut dyn std::io::Write) -> Result<bool, SerializeError> {
57 writer.write_all(&[b'"'])?;
58 writer.write_all(self.to_string().as_bytes())?;
59 writer.write_all(&[b'"'])?;
60
61 Ok(true)
62 }
63
64 fn serialize_extension(
65 &self,
66 _writer: &mut dyn std::io::Write,
67 ) -> Result<bool, SerializeError> {
68 Ok(false)
69 }
70
71 fn serialize_field(
72 &self,
73 field: &str,
74 writer: &mut dyn std::io::Write,
75 ) -> Result<bool, SerializeError> {
76 writer.write_all("\"".as_bytes())?;
77 writer.write_all(field.as_bytes())?;
78 writer.write_all("\":".as_bytes())?;
79 self.serialize_value(writer)?;
80
81 Ok(true)
82 }
83
84 fn is_fp_primitive(&self) -> bool {
85 false
86 }
87}
88
89impl<'de> Deserialize<'de> for Date {
90 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
91 where
92 D: serde::Deserializer<'de>,
93 {
94 let value = String::deserialize(deserializer)?;
95 parse_date(&value).map_err(|_| serde::de::Error::custom("invalid FHIR date"))
96 }
97}
98
99impl serde::Serialize for Date {
100 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
101 where
102 S: serde::Serializer,
103 {
104 self.to_string().serialize(serializer)
105 }
106}
107
108impl FHIRJSONDeserializer for Date {
109 fn from_json_str(
110 s: &str,
111 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
112 let mut json_value: Value = serde_json::from_str(s)?;
113 Date::from_serde_value(&mut json_value, Context::AsValue)
114 }
115
116 fn from_serde_value(
117 value: *mut Value,
118 context: haste_fhir_serialization_json::Context,
119 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
120 let value = unsafe { &mut *(value as *mut Value) };
121 let k =
122 get_value(&value, &context).and_then(|v| v.as_str().and_then(|v| parse_date(v).ok()));
123 k.ok_or_else(|| DeserializeError::FailedToConvertType("Date".to_string()))
124 }
125}
126
127impl FHIRJSONSerializer for Date {
128 fn serialize_value(&self, writer: &mut dyn std::io::Write) -> Result<bool, SerializeError> {
129 writer.write_all(&[b'"'])?;
130 writer.write_all(self.to_string().as_bytes())?;
131 writer.write_all(&[b'"'])?;
132
133 Ok(true)
134 }
135
136 fn serialize_extension(
137 &self,
138 _writer: &mut dyn std::io::Write,
139 ) -> Result<bool, SerializeError> {
140 Ok(false)
141 }
142
143 fn serialize_field(
144 &self,
145 field: &str,
146 writer: &mut dyn std::io::Write,
147 ) -> Result<bool, SerializeError> {
148 writer.write_all("\"".as_bytes())?;
149 writer.write_all(field.as_bytes())?;
150 writer.write_all("\":".as_bytes())?;
151 self.serialize_value(writer)?;
152
153 Ok(true)
154 }
155
156 fn is_fp_primitive(&self) -> bool {
157 false
158 }
159}
160
161impl serde::Serialize for Time {
162 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
163 where
164 S: serde::Serializer,
165 {
166 self.to_string().serialize(serializer)
167 }
168}
169
170impl<'de> Deserialize<'de> for Time {
171 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
172 where
173 D: serde::Deserializer<'de>,
174 {
175 let value = String::deserialize(deserializer)?;
176 parse_time(&value).map_err(|_| serde::de::Error::custom("invalid FHIR time"))
177 }
178}
179
180impl FHIRJSONDeserializer for Time {
181 fn from_json_str(
182 s: &str,
183 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
184 let mut json_value: Value = serde_json::from_str(s)?;
185 Time::from_serde_value(&mut json_value, Context::AsValue)
186 }
187
188 fn from_serde_value(
189 value: *mut Value,
190 context: haste_fhir_serialization_json::Context,
191 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
192 let value = unsafe { &mut *(value as *mut Value) };
193 let k =
194 get_value(&value, &context).and_then(|v| v.as_str().and_then(|v| parse_time(v).ok()));
195 k.ok_or_else(|| DeserializeError::FailedToConvertType("Time".to_string()))
196 }
197}
198
199impl FHIRJSONSerializer for Time {
200 fn serialize_value(&self, writer: &mut dyn std::io::Write) -> Result<bool, SerializeError> {
201 writer.write_all(&[b'"'])?;
202 writer.write_all(self.to_string().as_bytes())?;
203 writer.write_all(&[b'"'])?;
204
205 Ok(true)
206 }
207
208 fn serialize_extension(
209 &self,
210 _writer: &mut dyn std::io::Write,
211 ) -> Result<bool, SerializeError> {
212 Ok(false)
213 }
214
215 fn serialize_field(
216 &self,
217 field: &str,
218 writer: &mut dyn std::io::Write,
219 ) -> Result<bool, SerializeError> {
220 writer.write_all("\"".as_bytes())?;
221 writer.write_all(field.as_bytes())?;
222 writer.write_all("\":".as_bytes())?;
223 self.serialize_value(writer)?;
224
225 Ok(true)
226 }
227
228 fn is_fp_primitive(&self) -> bool {
229 false
230 }
231}
232
233impl serde::Serialize for Instant {
234 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
235 where
236 S: serde::Serializer,
237 {
238 self.to_string().serialize(serializer)
239 }
240}
241
242impl<'de> Deserialize<'de> for Instant {
243 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
244 where
245 D: serde::Deserializer<'de>,
246 {
247 let value = String::deserialize(deserializer)?;
248 parse_instant(&value).map_err(|_| serde::de::Error::custom("invalid FHIR instant"))
249 }
250}
251
252impl FHIRJSONDeserializer for Instant {
253 fn from_json_str(
254 s: &str,
255 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
256 let mut json_value: Value = serde_json::from_str(s)?;
257 Instant::from_serde_value(&mut json_value, Context::AsValue)
258 }
259
260 fn from_serde_value(
261 value: *mut Value,
262 context: haste_fhir_serialization_json::Context,
263 ) -> Result<Self, haste_fhir_serialization_json::errors::DeserializeError> {
264 let value = unsafe { &mut *(value as *mut Value) };
265 let k = get_value(&value, &context)
266 .and_then(|v| v.as_str().and_then(|v| parse_instant(v).ok()));
267 k.ok_or_else(|| DeserializeError::FailedToConvertType("Instant".to_string()))
268 }
269}
270
271impl FHIRJSONSerializer for Instant {
272 fn serialize_value(&self, writer: &mut dyn std::io::Write) -> Result<bool, SerializeError> {
273 writer.write_all(&[b'"'])?;
274 writer.write_all(self.to_string().as_bytes())?;
275 writer.write_all(&[b'"'])?;
276
277 Ok(true)
278 }
279
280 fn serialize_extension(
281 &self,
282 _writer: &mut dyn std::io::Write,
283 ) -> Result<bool, SerializeError> {
284 Ok(false)
285 }
286
287 fn serialize_field(
288 &self,
289 field: &str,
290 writer: &mut dyn std::io::Write,
291 ) -> Result<bool, SerializeError> {
292 writer.write_all("\"".as_bytes())?;
293 writer.write_all(field.as_bytes())?;
294 writer.write_all("\":".as_bytes())?;
295 self.serialize_value(writer)?;
296
297 Ok(true)
298 }
299
300 fn is_fp_primitive(&self) -> bool {
301 false
302 }
303}