1
- use serde::{Serialize, Deserialize};
1
+ use std::fmt::{self, Formatter};
2
+ use serde::{Deserializer, Deserialize, Serialize};
3
+ use serde::de::{Error, MapAccess, Visitor};
2
4
use serde_with::skip_serializing_none;
3
5
4
6
{{ model.description | block_comment }}
5
7
#[non_exhaustive]
6
8
#[skip_serializing_none]
7
- #[derive(Clone, Debug, PartialEq, Serialize, Deserialize )]
9
+ #[derive(Clone, Debug, PartialEq, Serialize)]
8
10
pub struct {{ name }} {
9
11
{% - for attr , schema in model .get ("properties" , {}).items () %}
10
12
{% - set propertyName = attr |variable_name %}
@@ -28,6 +30,9 @@ pub struct {{ name }} {
28
30
#[serde(flatten)]
29
31
pub additional_properties: std::collections::BTreeMap<String , {{ dataType }} >,
30
32
{% - endif %}
33
+ #[serde(skip)]
34
+ #[serde(default)]
35
+ pub(crate) _unparsed: bool
31
36
}
32
37
33
38
impl {{ name }} {
@@ -49,6 +54,7 @@ impl {{ name }} {
49
54
{% - if model .additionalProperties is defined and model .additionalProperties != false %}
50
55
additional_properties: std::collections::BTreeMap::new(),
51
56
{% - endif %}
57
+ _unparsed: false,
52
58
}
53
59
}
54
60
{% for attr , schema in model .get ("properties" , {}).items () if attr not in model .required %}
@@ -78,3 +84,98 @@ impl Default for {{ name }} {
78
84
}
79
85
}
80
86
{% - endif %}
87
+
88
+ impl<'de> Deserialize<'de> for {{ name }} {
89
+ fn deserialize<D >(deserializer: D) -> Result<Self , D::Error >
90
+ where
91
+ D: Deserializer<'de>,
92
+ {
93
+ struct {{ name }}Visitor;
94
+ impl<'a> Visitor<'a> for {{ name }}Visitor {
95
+ type Value = {{ name }};
96
+
97
+ fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result {
98
+ f.write_str("a mapping")
99
+ }
100
+
101
+ fn visit_map<M >(self, mut map: M) -> Result<Self::Value , M::Error >
102
+ where
103
+ M: MapAccess<'a>,
104
+ {
105
+ {% - for attr , schema in model .get ("properties" , {}).items () %}
106
+ {% - set required = attr in model .required %}
107
+ {% - set propertyName = attr |variable_name %}
108
+ {% - set nullable = schema .get ("nullable" , false )%}
109
+ {% - set dataType = get_type (schema , alternative_name =name + attr |variable_name , render_nullable =nullable , render_option =not required , render_box =false , version =version ) %}
110
+ let mut {{ propertyName }}: {% if required %} Option<{% endif %} {{ dataType }}{% if required %} >{% endif %} = None;
111
+ {% - endfor %}
112
+
113
+ {% - if model .additionalProperties is defined and model .additionalProperties != false %}
114
+ {% - set dataType = get_type (model .additionalProperties , alternative_name =None , render_nullable =false , render_option =false , render_box =false , version =version ) %}
115
+ let mut additional_properties: std::collections::BTreeMap<String , {{ dataType }} > = std::collections::BTreeMap::new();
116
+ {% - endif %}
117
+ let mut _unparsed = false;
118
+
119
+ while let Some((k, v)) = map.next_entry::<String , serde_json::Value >()? {
120
+ match k.as_str() {
121
+ {% - for attr , schema in model .get ("properties" , {}).items () %}
122
+ {% - set required = attr in model .required %}
123
+ {% - set propertyName = attr |variable_name %}
124
+ {% - set nullable = schema .get ("nullable" , false )%}
125
+ {% - set dataType = get_type (schema , alternative_name =name + propertyName , render_option =false , version =version ) %}
126
+ "{{ attr }}" => {
127
+ {% - if not nullable and not required %}
128
+ if v.is_null() {
129
+ continue;
130
+ }
131
+ {% - endif %}
132
+ {{ propertyName }} = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
133
+ {% - if schema .enum or schema .oneOf %}
134
+ if let Some(ref _{{ propertyName }}) = {{ propertyName }} {
135
+ match _{{ propertyName }} {
136
+ {% if nullable %} Some({% endif %} {{ dataType }}::UnparsedObject(_{{ propertyName }}){% if nullable %} ){% endif %} => {
137
+ _unparsed = true;
138
+ },
139
+ _ => {}
140
+ }
141
+ }
142
+ {% - endif %}
143
+ },
144
+ {% - endfor %}
145
+ & _ => {
146
+ {% - if model .additionalProperties is defined and model .additionalProperties != false %}
147
+ if let Ok(value) = serde_json::from_value(v.clone()) {
148
+ additional_properties.insert(k, value);
149
+ }
150
+ {% - endif %}
151
+ },
152
+ }
153
+ }
154
+
155
+ {% - for attr , schema in model .get ("properties" , {}).items () %}
156
+ {% - set required = attr in model .required %}
157
+ {% - set propertyName = attr |variable_name %}
158
+ {% - set nullable = schema .get ("nullable" , false )%}
159
+ {% - if required %}
160
+ let {{ propertyName }} = {{ propertyName }}.ok_or_else(|| M::Error::missing_field("{{ propertyName }}"))?;
161
+ {% - endif %}
162
+ {% - endfor %}
163
+
164
+ let content = {{ name }} {
165
+ {% - for attr , schema in model .get ("properties" , {}).items () %}
166
+ {% - set propertyName = attr |variable_name %}
167
+ {{ propertyName }},
168
+ {% - endfor %}
169
+ {% - if model .additionalProperties is defined and model .additionalProperties != false %}
170
+ additional_properties,
171
+ {% - endif %}
172
+ _unparsed,
173
+ };
174
+
175
+ Ok(content)
176
+ }
177
+ }
178
+
179
+ deserializer.deserialize_any({{ name }}Visitor)
180
+ }
181
+ }
0 commit comments