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