nominal_api/conjure/objects/storage/writer/api/
points_external.rs1use conjure_object::serde::{ser, de};
2use conjure_object::serde::ser::SerializeMap as SerializeMap_;
3use conjure_object::private::{UnionField_, UnionTypeField_};
4use std::fmt;
5#[derive(Debug, Clone, conjure_object::private::DeriveWith)]
6#[derive_with(PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub enum PointsExternal {
8 String(Vec<super::StringPoint>),
9 Double(Vec<super::DoublePoint>),
10 Int(Vec<super::IntPoint>),
11 Uint64(Vec<super::Uint64Point>),
12 Array(Box<super::ArrayPoints>),
13 Struct(Vec<super::StructPoint>),
14 Unknown(Unknown),
16}
17impl ser::Serialize for PointsExternal {
18 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
19 where
20 S: ser::Serializer,
21 {
22 let mut map = s.serialize_map(Some(2))?;
23 match self {
24 PointsExternal::String(value) => {
25 map.serialize_entry(&"type", &"string")?;
26 map.serialize_entry(&"string", value)?;
27 }
28 PointsExternal::Double(value) => {
29 map.serialize_entry(&"type", &"double")?;
30 map.serialize_entry(&"double", value)?;
31 }
32 PointsExternal::Int(value) => {
33 map.serialize_entry(&"type", &"int")?;
34 map.serialize_entry(&"int", value)?;
35 }
36 PointsExternal::Uint64(value) => {
37 map.serialize_entry(&"type", &"uint64")?;
38 map.serialize_entry(&"uint64", value)?;
39 }
40 PointsExternal::Array(value) => {
41 map.serialize_entry(&"type", &"array")?;
42 map.serialize_entry(&"array", value)?;
43 }
44 PointsExternal::Struct(value) => {
45 map.serialize_entry(&"type", &"struct")?;
46 map.serialize_entry(&"struct", value)?;
47 }
48 PointsExternal::Unknown(value) => {
49 map.serialize_entry(&"type", &value.type_)?;
50 map.serialize_entry(&value.type_, &value.value)?;
51 }
52 }
53 map.end()
54 }
55}
56impl<'de> de::Deserialize<'de> for PointsExternal {
57 fn deserialize<D>(d: D) -> Result<PointsExternal, D::Error>
58 where
59 D: de::Deserializer<'de>,
60 {
61 d.deserialize_map(Visitor_)
62 }
63}
64struct Visitor_;
65impl<'de> de::Visitor<'de> for Visitor_ {
66 type Value = PointsExternal;
67 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
68 fmt.write_str("union PointsExternal")
69 }
70 fn visit_map<A>(self, mut map: A) -> Result<PointsExternal, A::Error>
71 where
72 A: de::MapAccess<'de>,
73 {
74 let v = match map.next_key::<UnionField_<Variant_>>()? {
75 Some(UnionField_::Type) => {
76 let variant = map.next_value()?;
77 let key = map.next_key()?;
78 match (variant, key) {
79 (Variant_::String, Some(Variant_::String)) => {
80 let value = map.next_value()?;
81 PointsExternal::String(value)
82 }
83 (Variant_::Double, Some(Variant_::Double)) => {
84 let value = map.next_value()?;
85 PointsExternal::Double(value)
86 }
87 (Variant_::Int, Some(Variant_::Int)) => {
88 let value = map.next_value()?;
89 PointsExternal::Int(value)
90 }
91 (Variant_::Uint64, Some(Variant_::Uint64)) => {
92 let value = map.next_value()?;
93 PointsExternal::Uint64(value)
94 }
95 (Variant_::Array, Some(Variant_::Array)) => {
96 let value = map.next_value()?;
97 PointsExternal::Array(value)
98 }
99 (Variant_::Struct, Some(Variant_::Struct)) => {
100 let value = map.next_value()?;
101 PointsExternal::Struct(value)
102 }
103 (Variant_::Unknown(type_), Some(Variant_::Unknown(b))) => {
104 if type_ == b {
105 let value = map.next_value()?;
106 PointsExternal::Unknown(Unknown { type_, value })
107 } else {
108 return Err(
109 de::Error::invalid_value(de::Unexpected::Str(&type_), &&*b),
110 )
111 }
112 }
113 (variant, Some(key)) => {
114 return Err(
115 de::Error::invalid_value(
116 de::Unexpected::Str(key.as_str()),
117 &variant.as_str(),
118 ),
119 );
120 }
121 (variant, None) => {
122 return Err(de::Error::missing_field(variant.as_str()));
123 }
124 }
125 }
126 Some(UnionField_::Value(variant)) => {
127 let value = match &variant {
128 Variant_::String => {
129 let value = map.next_value()?;
130 PointsExternal::String(value)
131 }
132 Variant_::Double => {
133 let value = map.next_value()?;
134 PointsExternal::Double(value)
135 }
136 Variant_::Int => {
137 let value = map.next_value()?;
138 PointsExternal::Int(value)
139 }
140 Variant_::Uint64 => {
141 let value = map.next_value()?;
142 PointsExternal::Uint64(value)
143 }
144 Variant_::Array => {
145 let value = map.next_value()?;
146 PointsExternal::Array(value)
147 }
148 Variant_::Struct => {
149 let value = map.next_value()?;
150 PointsExternal::Struct(value)
151 }
152 Variant_::Unknown(type_) => {
153 let value = map.next_value()?;
154 PointsExternal::Unknown(Unknown {
155 type_: type_.clone(),
156 value,
157 })
158 }
159 };
160 if map.next_key::<UnionTypeField_>()?.is_none() {
161 return Err(de::Error::missing_field("type"));
162 }
163 let type_variant = map.next_value::<Variant_>()?;
164 if variant != type_variant {
165 return Err(
166 de::Error::invalid_value(
167 de::Unexpected::Str(type_variant.as_str()),
168 &variant.as_str(),
169 ),
170 );
171 }
172 value
173 }
174 None => return Err(de::Error::missing_field("type")),
175 };
176 if map.next_key::<UnionField_<Variant_>>()?.is_some() {
177 return Err(de::Error::invalid_length(3, &"type and value fields"));
178 }
179 Ok(v)
180 }
181}
182#[derive(PartialEq)]
183enum Variant_ {
184 String,
185 Double,
186 Int,
187 Uint64,
188 Array,
189 Struct,
190 Unknown(Box<str>),
191}
192impl Variant_ {
193 fn as_str(&self) -> &'static str {
194 match *self {
195 Variant_::String => "string",
196 Variant_::Double => "double",
197 Variant_::Int => "int",
198 Variant_::Uint64 => "uint64",
199 Variant_::Array => "array",
200 Variant_::Struct => "struct",
201 Variant_::Unknown(_) => "unknown variant",
202 }
203 }
204}
205impl<'de> de::Deserialize<'de> for Variant_ {
206 fn deserialize<D>(d: D) -> Result<Variant_, D::Error>
207 where
208 D: de::Deserializer<'de>,
209 {
210 d.deserialize_str(VariantVisitor_)
211 }
212}
213struct VariantVisitor_;
214impl<'de> de::Visitor<'de> for VariantVisitor_ {
215 type Value = Variant_;
216 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
217 fmt.write_str("string")
218 }
219 fn visit_str<E>(self, value: &str) -> Result<Variant_, E>
220 where
221 E: de::Error,
222 {
223 let v = match value {
224 "string" => Variant_::String,
225 "double" => Variant_::Double,
226 "int" => Variant_::Int,
227 "uint64" => Variant_::Uint64,
228 "array" => Variant_::Array,
229 "struct" => Variant_::Struct,
230 value => Variant_::Unknown(value.to_string().into_boxed_str()),
231 };
232 Ok(v)
233 }
234}
235#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
237pub struct Unknown {
238 type_: Box<str>,
239 value: conjure_object::Any,
240}
241impl Unknown {
242 #[inline]
244 pub fn type_(&self) -> &str {
245 &self.type_
246 }
247}