Skip to main content

surrealdb_types/traits/
de.rs

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