Skip to main content

json_syntax/serde/de/
mod.rs

1use std::fmt;
2
3use serde::{
4	Deserialize,
5	de::{
6		DeserializeSeed, EnumAccess, Expected, IntoDeserializer, MapAccess, SeqAccess, Unexpected,
7		VariantAccess, Visitor,
8	},
9	forward_to_deserialize_any,
10};
11
12use crate::{
13	JsonArrayBuf, JsonNumberBuf, JsonObject, JsonValue,
14	object::{Entry, Key},
15	serde::NUMBER_TOKEN,
16};
17
18mod number;
19
20pub use number::JsonNumberVisitor;
21
22impl JsonValue {
23	#[cold]
24	fn invalid_type<E>(&self, exp: &dyn Expected) -> E
25	where
26		E: serde::de::Error,
27	{
28		serde::de::Error::invalid_type(self.unexpected(), exp)
29	}
30
31	#[cold]
32	fn unexpected(&self) -> Unexpected<'_> {
33		match self {
34			Self::Null => Unexpected::Unit,
35			Self::Boolean(b) => Unexpected::Bool(*b),
36			Self::Number(n) => match n.as_u64() {
37				Some(u) => Unexpected::Unsigned(u),
38				None => match n.as_i64() {
39					Some(i) => Unexpected::Signed(i),
40					None => Unexpected::Float(n.as_f64_lossy()),
41				},
42			},
43			Self::String(s) => Unexpected::Str(s),
44			Self::Array(_) => Unexpected::Seq,
45			Self::Object(_) => Unexpected::Map,
46		}
47	}
48}
49
50impl<'de> Deserialize<'de> for JsonValue {
51	#[inline]
52	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
53	where
54		D: serde::Deserializer<'de>,
55	{
56		struct ValueVisitor;
57
58		impl<'de> Visitor<'de> for ValueVisitor {
59			type Value = JsonValue;
60
61			fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
62				formatter.write_str("any valid JSON value")
63			}
64
65			#[inline]
66			fn visit_bool<E>(self, value: bool) -> Result<JsonValue, E> {
67				Ok(JsonValue::Boolean(value))
68			}
69
70			#[inline]
71			fn visit_i64<E>(self, value: i64) -> Result<JsonValue, E> {
72				Ok(JsonValue::Number(value.into()))
73			}
74
75			#[inline]
76			fn visit_u64<E>(self, value: u64) -> Result<JsonValue, E> {
77				Ok(JsonValue::Number(value.into()))
78			}
79
80			#[inline]
81			fn visit_f64<E>(self, value: f64) -> Result<JsonValue, E> {
82				Ok(JsonNumberBuf::try_from(value).map_or(JsonValue::Null, JsonValue::Number))
83			}
84
85			#[inline]
86			fn visit_str<E>(self, value: &str) -> Result<JsonValue, E>
87			where
88				E: serde::de::Error,
89			{
90				Ok(JsonValue::String(value.into()))
91			}
92
93			#[inline]
94			fn visit_string<E>(self, value: String) -> Result<JsonValue, E> {
95				Ok(JsonValue::String(value.into()))
96			}
97
98			#[inline]
99			fn visit_none<E>(self) -> Result<JsonValue, E> {
100				Ok(JsonValue::Null)
101			}
102
103			#[inline]
104			fn visit_some<D>(self, deserializer: D) -> Result<JsonValue, D::Error>
105			where
106				D: serde::Deserializer<'de>,
107			{
108				Deserialize::deserialize(deserializer)
109			}
110
111			#[inline]
112			fn visit_unit<E>(self) -> Result<JsonValue, E> {
113				Ok(JsonValue::Null)
114			}
115
116			#[inline]
117			fn visit_seq<V>(self, mut visitor: V) -> Result<JsonValue, V::Error>
118			where
119				V: SeqAccess<'de>,
120			{
121				let mut vec = Vec::new();
122
123				while let Some(elem) = visitor.next_element()? {
124					vec.push(elem);
125				}
126
127				Ok(JsonValue::Array(vec))
128			}
129
130			fn visit_map<V>(self, mut visitor: V) -> Result<JsonValue, V::Error>
131			where
132				V: MapAccess<'de>,
133			{
134				enum MapTag {
135					Number,
136					None(Key),
137				}
138
139				impl<'de> Deserialize<'de> for MapTag {
140					fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
141					where
142						D: serde::Deserializer<'de>,
143					{
144						struct Visitor;
145
146						impl<'de> serde::de::Visitor<'de> for Visitor {
147							type Value = MapTag;
148
149							fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
150								formatter.write_str("a string key")
151							}
152
153							fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
154							where
155								E: serde::de::Error,
156							{
157								if v == NUMBER_TOKEN {
158									Ok(MapTag::Number)
159								} else {
160									Ok(MapTag::None(v.into()))
161								}
162							}
163
164							fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
165							where
166								E: serde::de::Error,
167							{
168								if v == NUMBER_TOKEN {
169									Ok(MapTag::Number)
170								} else {
171									Ok(MapTag::None(v.into()))
172								}
173							}
174						}
175
176						deserializer.deserialize_string(Visitor)
177					}
178				}
179
180				match visitor.next_key()? {
181					Some(MapTag::Number) => {
182						let value: String = visitor.next_value()?;
183						JsonNumberBuf::new(value)
184							.map(JsonValue::Number)
185							.map_err(serde::de::Error::custom)
186					}
187					Some(MapTag::None(key)) => {
188						let mut object = JsonObject::new();
189
190						object.insert(key, visitor.next_value()?);
191						while let Some((key, value)) = visitor.next_entry::<Key, JsonValue>()? {
192							object.insert(key, value);
193						}
194
195						Ok(JsonValue::Object(object))
196					}
197					None => Ok(JsonValue::Object(JsonObject::new())),
198				}
199			}
200		}
201
202		deserializer.deserialize_any(ValueVisitor)
203	}
204}
205
206impl<'de> IntoDeserializer<'de, DeserializeError> for JsonValue {
207	type Deserializer = Self;
208
209	fn into_deserializer(self) -> Self::Deserializer {
210		self
211	}
212}
213
214impl<'de> Deserialize<'de> for JsonObject {
215	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
216	where
217		D: serde::Deserializer<'de>,
218	{
219		struct Visitor;
220
221		impl<'de> serde::de::Visitor<'de> for Visitor {
222			type Value = JsonObject;
223
224			fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
225				write!(formatter, "a JSON object")
226			}
227
228			fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
229			where
230				A: MapAccess<'de>,
231			{
232				let mut object = JsonObject::new();
233
234				while let Some((key, value)) = map.next_entry::<Key, JsonValue>()? {
235					object.insert(key, value);
236				}
237
238				Ok(object)
239			}
240		}
241
242		deserializer.deserialize_map(Visitor)
243	}
244}
245
246impl<'de> IntoDeserializer<'de, DeserializeError> for JsonObject {
247	type Deserializer = JsonValue;
248
249	fn into_deserializer(self) -> Self::Deserializer {
250		JsonValue::Object(self)
251	}
252}
253
254#[derive(Debug, Clone)]
255pub enum DeserializeError {
256	Custom(String),
257	NonStringKey,
258}
259
260impl fmt::Display for DeserializeError {
261	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
262		match self {
263			Self::Custom(msg) => msg.fmt(f),
264			Self::NonStringKey => write!(f, "key must be a string"),
265		}
266	}
267}
268
269impl From<number::Unexpected> for DeserializeError {
270	fn from(value: number::Unexpected) -> Self {
271		Self::Custom(value.to_string())
272	}
273}
274
275impl std::error::Error for DeserializeError {}
276
277impl serde::de::Error for DeserializeError {
278	fn custom<T>(msg: T) -> Self
279	where
280		T: fmt::Display,
281	{
282		Self::Custom(msg.to_string())
283	}
284}
285
286macro_rules! deserialize_number {
287	($method:ident) => {
288		fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
289		where
290			V: serde::de::Visitor<'de>,
291		{
292			match self {
293				JsonValue::Number(n) => Ok(n.deserialize_any(visitor)?),
294				_ => Err(self.invalid_type(&visitor)),
295			}
296		}
297	};
298}
299
300impl<'de> serde::Deserializer<'de> for JsonValue {
301	type Error = DeserializeError;
302
303	#[inline]
304	fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
305	where
306		V: serde::de::Visitor<'de>,
307	{
308		match self {
309			Self::Null => visitor.visit_unit(),
310			Self::Boolean(v) => visitor.visit_bool(v),
311			Self::Number(n) => Ok(n.deserialize_any(visitor)?),
312			Self::String(s) => visitor.visit_string(s.into_string()),
313			Self::Array(a) => visit_array(a, visitor),
314			Self::Object(o) => visit_object(o, visitor),
315		}
316	}
317
318	deserialize_number!(deserialize_i8);
319	deserialize_number!(deserialize_i16);
320	deserialize_number!(deserialize_i32);
321	deserialize_number!(deserialize_i64);
322	deserialize_number!(deserialize_i128);
323	deserialize_number!(deserialize_u8);
324	deserialize_number!(deserialize_u16);
325	deserialize_number!(deserialize_u32);
326	deserialize_number!(deserialize_u64);
327	deserialize_number!(deserialize_u128);
328	deserialize_number!(deserialize_f32);
329	deserialize_number!(deserialize_f64);
330
331	#[inline]
332	fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
333	where
334		V: serde::de::Visitor<'de>,
335	{
336		match self {
337			JsonValue::Null => visitor.visit_none(),
338			_ => visitor.visit_some(self),
339		}
340	}
341
342	#[inline]
343	fn deserialize_enum<V>(
344		self,
345		_name: &str,
346		_variants: &'static [&'static str],
347		visitor: V,
348	) -> Result<V::Value, Self::Error>
349	where
350		V: serde::de::Visitor<'de>,
351	{
352		let (variant, value) = match self {
353			JsonValue::Object(value) => {
354				let mut iter = value.into_iter();
355				let (variant, value) = match iter.next() {
356					Some(v) => v,
357					None => {
358						return Err(serde::de::Error::invalid_value(
359							Unexpected::Map,
360							&"map with a single key",
361						));
362					}
363				};
364				// enums are encoded in json as maps with a single key:value pair
365				if iter.next().is_some() {
366					return Err(serde::de::Error::invalid_value(
367						Unexpected::Map,
368						&"map with a single key",
369					));
370				}
371				(variant, Some(value))
372			}
373			JsonValue::String(variant) => (variant, None),
374			other => {
375				return Err(serde::de::Error::invalid_type(
376					other.unexpected(),
377					&"string or map",
378				));
379			}
380		};
381
382		visitor.visit_enum(EnumDeserializer { variant, value })
383	}
384
385	#[inline]
386	fn deserialize_newtype_struct<V>(
387		self,
388		_name: &'static str,
389		visitor: V,
390	) -> Result<V::Value, Self::Error>
391	where
392		V: serde::de::Visitor<'de>,
393	{
394		visitor.visit_newtype_struct(self)
395	}
396
397	fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
398	where
399		V: serde::de::Visitor<'de>,
400	{
401		match self {
402			JsonValue::Boolean(v) => visitor.visit_bool(v),
403			_ => Err(self.invalid_type(&visitor)),
404		}
405	}
406
407	fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
408	where
409		V: serde::de::Visitor<'de>,
410	{
411		self.deserialize_string(visitor)
412	}
413
414	fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
415	where
416		V: serde::de::Visitor<'de>,
417	{
418		self.deserialize_string(visitor)
419	}
420
421	fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
422	where
423		V: serde::de::Visitor<'de>,
424	{
425		match self {
426			JsonValue::String(v) => visitor.visit_string(v.into_string()),
427			_ => Err(self.invalid_type(&visitor)),
428		}
429	}
430
431	fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
432	where
433		V: serde::de::Visitor<'de>,
434	{
435		self.deserialize_byte_buf(visitor)
436	}
437
438	fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
439	where
440		V: serde::de::Visitor<'de>,
441	{
442		match self {
443			JsonValue::String(v) => visitor.visit_string(v.into_string()),
444			JsonValue::Array(v) => visit_array(v, visitor),
445			_ => Err(self.invalid_type(&visitor)),
446		}
447	}
448
449	fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
450	where
451		V: serde::de::Visitor<'de>,
452	{
453		match self {
454			JsonValue::Null => visitor.visit_unit(),
455			_ => Err(self.invalid_type(&visitor)),
456		}
457	}
458
459	fn deserialize_unit_struct<V>(
460		self,
461		_name: &'static str,
462		visitor: V,
463	) -> Result<V::Value, Self::Error>
464	where
465		V: serde::de::Visitor<'de>,
466	{
467		self.deserialize_unit(visitor)
468	}
469
470	fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
471	where
472		V: serde::de::Visitor<'de>,
473	{
474		match self {
475			JsonValue::Array(v) => visit_array(v, visitor),
476			_ => Err(self.invalid_type(&visitor)),
477		}
478	}
479
480	fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
481	where
482		V: serde::de::Visitor<'de>,
483	{
484		self.deserialize_seq(visitor)
485	}
486
487	fn deserialize_tuple_struct<V>(
488		self,
489		_name: &'static str,
490		_len: usize,
491		visitor: V,
492	) -> Result<V::Value, Self::Error>
493	where
494		V: serde::de::Visitor<'de>,
495	{
496		self.deserialize_seq(visitor)
497	}
498
499	fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
500	where
501		V: serde::de::Visitor<'de>,
502	{
503		match self {
504			JsonValue::Object(v) => visit_object(v, visitor),
505			_ => Err(self.invalid_type(&visitor)),
506		}
507	}
508
509	fn deserialize_struct<V>(
510		self,
511		_name: &'static str,
512		_fields: &'static [&'static str],
513		visitor: V,
514	) -> Result<V::Value, Self::Error>
515	where
516		V: serde::de::Visitor<'de>,
517	{
518		match self {
519			JsonValue::Array(v) => visit_array(v, visitor),
520			JsonValue::Object(v) => visit_object(v, visitor),
521			_ => Err(self.invalid_type(&visitor)),
522		}
523	}
524
525	fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
526	where
527		V: serde::de::Visitor<'de>,
528	{
529		self.deserialize_string(visitor)
530	}
531
532	fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
533	where
534		V: serde::de::Visitor<'de>,
535	{
536		drop(self);
537		visitor.visit_unit()
538	}
539}
540
541fn visit_array<'de, V>(a: JsonArrayBuf, visitor: V) -> Result<V::Value, DeserializeError>
542where
543	V: serde::de::Visitor<'de>,
544{
545	let len = a.len();
546	let mut deserializer = ArrayDeserializer::new(a);
547	let seq = visitor.visit_seq(&mut deserializer)?;
548	let remaining = deserializer.iter.len();
549	if remaining == 0 {
550		Ok(seq)
551	} else {
552		Err(serde::de::Error::invalid_length(
553			len,
554			&"fewer elements in array",
555		))
556	}
557}
558
559fn visit_object<'de, V>(o: JsonObject, visitor: V) -> Result<V::Value, DeserializeError>
560where
561	V: serde::de::Visitor<'de>,
562{
563	let len = o.len();
564	let mut deserializer = ObjectDeserializer::new(o);
565	let map = visitor.visit_map(&mut deserializer)?;
566	let remaining = deserializer.iter.len();
567	if remaining == 0 {
568		Ok(map)
569	} else {
570		Err(serde::de::Error::invalid_length(
571			len,
572			&"fewer elements in map",
573		))
574	}
575}
576
577struct ArrayDeserializer {
578	iter: std::vec::IntoIter<JsonValue>,
579}
580
581impl ArrayDeserializer {
582	fn new(array: JsonArrayBuf) -> Self {
583		Self {
584			iter: array.into_iter(),
585		}
586	}
587}
588
589impl<'de> SeqAccess<'de> for ArrayDeserializer {
590	type Error = DeserializeError;
591
592	fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
593	where
594		T: DeserializeSeed<'de>,
595	{
596		match self.iter.next() {
597			Some(value) => seed.deserialize(value).map(Some),
598			None => Ok(None),
599		}
600	}
601
602	fn size_hint(&self) -> Option<usize> {
603		match self.iter.size_hint() {
604			(lower, Some(upper)) if lower == upper => Some(upper),
605			_ => None,
606		}
607	}
608}
609
610struct ObjectDeserializer {
611	iter: std::vec::IntoIter<Entry>,
612	value: Option<JsonValue>,
613}
614
615impl ObjectDeserializer {
616	fn new(obj: JsonObject) -> Self {
617		Self {
618			iter: obj.into_iter(),
619			value: None,
620		}
621	}
622}
623
624impl<'de> MapAccess<'de> for ObjectDeserializer {
625	type Error = DeserializeError;
626
627	fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
628	where
629		T: DeserializeSeed<'de>,
630	{
631		match self.iter.next() {
632			Some((key, value)) => {
633				self.value = Some(value);
634				let key_de = MapKeyDeserializer { key };
635				seed.deserialize(key_de).map(Some)
636			}
637			None => Ok(None),
638		}
639	}
640
641	fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
642	where
643		T: DeserializeSeed<'de>,
644	{
645		match self.value.take() {
646			Some(value) => seed.deserialize(value),
647			None => Err(serde::de::Error::custom("value is missing")),
648		}
649	}
650
651	fn size_hint(&self) -> Option<usize> {
652		match self.iter.size_hint() {
653			(lower, Some(upper)) if lower == upper => Some(upper),
654			_ => None,
655		}
656	}
657}
658
659struct MapKeyDeserializer {
660	key: Key,
661}
662
663macro_rules! deserialize_integer_key {
664	($method:ident => $visit:ident) => {
665		fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
666		where
667			V: serde::de::Visitor<'de>,
668		{
669			match (self.key.parse(), self.key) {
670				(Ok(integer), _) => visitor.$visit(integer),
671				(Err(_), key) => visitor.visit_string(key.into_string()),
672			}
673		}
674	};
675}
676
677impl<'de> serde::Deserializer<'de> for MapKeyDeserializer {
678	type Error = DeserializeError;
679
680	fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
681	where
682		V: serde::de::Visitor<'de>,
683	{
684		visitor.visit_string(self.key.into_string())
685	}
686
687	deserialize_integer_key!(deserialize_i8 => visit_i8);
688	deserialize_integer_key!(deserialize_i16 => visit_i16);
689	deserialize_integer_key!(deserialize_i32 => visit_i32);
690	deserialize_integer_key!(deserialize_i64 => visit_i64);
691	deserialize_integer_key!(deserialize_i128 => visit_i128);
692	deserialize_integer_key!(deserialize_u8 => visit_u8);
693	deserialize_integer_key!(deserialize_u16 => visit_u16);
694	deserialize_integer_key!(deserialize_u32 => visit_u32);
695	deserialize_integer_key!(deserialize_u64 => visit_u64);
696	deserialize_integer_key!(deserialize_u128 => visit_u128);
697
698	#[inline]
699	fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
700	where
701		V: serde::de::Visitor<'de>,
702	{
703		// Map keys cannot be null.
704		visitor.visit_some(self)
705	}
706
707	#[inline]
708	fn deserialize_newtype_struct<V>(
709		self,
710		_name: &'static str,
711		visitor: V,
712	) -> Result<V::Value, Self::Error>
713	where
714		V: serde::de::Visitor<'de>,
715	{
716		visitor.visit_newtype_struct(self)
717	}
718
719	fn deserialize_enum<V>(
720		self,
721		name: &'static str,
722		variants: &'static [&'static str],
723		visitor: V,
724	) -> Result<V::Value, Self::Error>
725	where
726		V: serde::de::Visitor<'de>,
727	{
728		self.key
729			.into_deserializer()
730			.deserialize_enum(name, variants, visitor)
731	}
732
733	forward_to_deserialize_any! {
734		bool f32 f64 char str string bytes byte_buf unit unit_struct seq tuple
735		tuple_struct map struct identifier ignored_any
736	}
737}
738
739struct EnumDeserializer {
740	variant: Key,
741	value: Option<JsonValue>,
742}
743
744impl<'de> EnumAccess<'de> for EnumDeserializer {
745	type Error = DeserializeError;
746	type Variant = VariantDeserializer;
747
748	fn variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer), Self::Error>
749	where
750		V: DeserializeSeed<'de>,
751	{
752		let variant = self.variant.into_deserializer();
753		let visitor = VariantDeserializer { value: self.value };
754		seed.deserialize(variant).map(|v| (v, visitor))
755	}
756}
757
758struct VariantDeserializer {
759	value: Option<JsonValue>,
760}
761
762impl<'de> VariantAccess<'de> for VariantDeserializer {
763	type Error = DeserializeError;
764
765	fn unit_variant(self) -> Result<(), Self::Error> {
766		match self.value {
767			Some(value) => serde::Deserialize::deserialize(value),
768			None => Ok(()),
769		}
770	}
771
772	fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
773	where
774		T: DeserializeSeed<'de>,
775	{
776		match self.value {
777			Some(value) => seed.deserialize(value),
778			None => Err(serde::de::Error::invalid_type(
779				Unexpected::UnitVariant,
780				&"newtype variant",
781			)),
782		}
783	}
784
785	fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
786	where
787		V: serde::de::Visitor<'de>,
788	{
789		match self.value {
790			Some(JsonValue::Array(v)) => {
791				if v.is_empty() {
792					visitor.visit_unit()
793				} else {
794					visit_array(v, visitor)
795				}
796			}
797			Some(other) => Err(serde::de::Error::invalid_type(
798				other.unexpected(),
799				&"tuple variant",
800			)),
801			None => Err(serde::de::Error::invalid_type(
802				Unexpected::UnitVariant,
803				&"tuple variant",
804			)),
805		}
806	}
807
808	fn struct_variant<V>(
809		self,
810		_fields: &'static [&'static str],
811		visitor: V,
812	) -> Result<V::Value, Self::Error>
813	where
814		V: serde::de::Visitor<'de>,
815	{
816		match self.value {
817			Some(JsonValue::Object(v)) => visit_object(v, visitor),
818			Some(other) => Err(serde::de::Error::invalid_type(
819				other.unexpected(),
820				&"struct variant",
821			)),
822			None => Err(serde::de::Error::invalid_type(
823				Unexpected::UnitVariant,
824				&"struct variant",
825			)),
826		}
827	}
828}