nominal_api/conjure/objects/storage/writer/api/
column_values.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 ColumnValues {
8 Strings(Vec<String>),
9 Doubles(#[derive_with(with = conjure_object::private::DoubleWrapper)] Vec<f64>),
10 Ints(Vec<i32>),
11 Uint64s(Vec<conjure_object::SafeLong>),
12 Arrays(Box<super::ArraysValues>),
13 Structs(Vec<String>),
14 Unknown(Unknown),
16}
17impl ser::Serialize for ColumnValues {
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 ColumnValues::Strings(value) => {
25 map.serialize_entry(&"type", &"strings")?;
26 map.serialize_entry(&"strings", value)?;
27 }
28 ColumnValues::Doubles(value) => {
29 map.serialize_entry(&"type", &"doubles")?;
30 map.serialize_entry(&"doubles", value)?;
31 }
32 ColumnValues::Ints(value) => {
33 map.serialize_entry(&"type", &"ints")?;
34 map.serialize_entry(&"ints", value)?;
35 }
36 ColumnValues::Uint64s(value) => {
37 map.serialize_entry(&"type", &"uint64s")?;
38 map.serialize_entry(&"uint64s", value)?;
39 }
40 ColumnValues::Arrays(value) => {
41 map.serialize_entry(&"type", &"arrays")?;
42 map.serialize_entry(&"arrays", value)?;
43 }
44 ColumnValues::Structs(value) => {
45 map.serialize_entry(&"type", &"structs")?;
46 map.serialize_entry(&"structs", value)?;
47 }
48 ColumnValues::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 ColumnValues {
57 fn deserialize<D>(d: D) -> Result<ColumnValues, 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 = ColumnValues;
67 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
68 fmt.write_str("union ColumnValues")
69 }
70 fn visit_map<A>(self, mut map: A) -> Result<ColumnValues, 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_::Strings, Some(Variant_::Strings)) => {
80 let value = map.next_value()?;
81 ColumnValues::Strings(value)
82 }
83 (Variant_::Doubles, Some(Variant_::Doubles)) => {
84 let value = map.next_value()?;
85 ColumnValues::Doubles(value)
86 }
87 (Variant_::Ints, Some(Variant_::Ints)) => {
88 let value = map.next_value()?;
89 ColumnValues::Ints(value)
90 }
91 (Variant_::Uint64s, Some(Variant_::Uint64s)) => {
92 let value = map.next_value()?;
93 ColumnValues::Uint64s(value)
94 }
95 (Variant_::Arrays, Some(Variant_::Arrays)) => {
96 let value = map.next_value()?;
97 ColumnValues::Arrays(value)
98 }
99 (Variant_::Structs, Some(Variant_::Structs)) => {
100 let value = map.next_value()?;
101 ColumnValues::Structs(value)
102 }
103 (Variant_::Unknown(type_), Some(Variant_::Unknown(b))) => {
104 if type_ == b {
105 let value = map.next_value()?;
106 ColumnValues::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_::Strings => {
129 let value = map.next_value()?;
130 ColumnValues::Strings(value)
131 }
132 Variant_::Doubles => {
133 let value = map.next_value()?;
134 ColumnValues::Doubles(value)
135 }
136 Variant_::Ints => {
137 let value = map.next_value()?;
138 ColumnValues::Ints(value)
139 }
140 Variant_::Uint64s => {
141 let value = map.next_value()?;
142 ColumnValues::Uint64s(value)
143 }
144 Variant_::Arrays => {
145 let value = map.next_value()?;
146 ColumnValues::Arrays(value)
147 }
148 Variant_::Structs => {
149 let value = map.next_value()?;
150 ColumnValues::Structs(value)
151 }
152 Variant_::Unknown(type_) => {
153 let value = map.next_value()?;
154 ColumnValues::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 Strings,
185 Doubles,
186 Ints,
187 Uint64s,
188 Arrays,
189 Structs,
190 Unknown(Box<str>),
191}
192impl Variant_ {
193 fn as_str(&self) -> &'static str {
194 match *self {
195 Variant_::Strings => "strings",
196 Variant_::Doubles => "doubles",
197 Variant_::Ints => "ints",
198 Variant_::Uint64s => "uint64s",
199 Variant_::Arrays => "arrays",
200 Variant_::Structs => "structs",
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 "strings" => Variant_::Strings,
225 "doubles" => Variant_::Doubles,
226 "ints" => Variant_::Ints,
227 "uint64s" => Variant_::Uint64s,
228 "arrays" => Variant_::Arrays,
229 "structs" => Variant_::Structs,
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}