Path: blob/main/crates/bevy_reflect/src/serde/de/options.rs
6600 views
use crate::{1serde::{2de::{error_utils::make_custom_error, registration_utils::try_get_registration},3TypedReflectDeserializer,4},5DynamicEnum, DynamicTuple, EnumInfo, TypeRegistry, VariantInfo,6};7use core::{fmt, fmt::Formatter};8use serde::de::{DeserializeSeed, Error, Visitor};910use super::ReflectDeserializerProcessor;1112/// A [`Visitor`] for deserializing [`Option`] values.13pub(super) struct OptionVisitor<'a, P> {14pub enum_info: &'static EnumInfo,15pub registry: &'a TypeRegistry,16pub processor: Option<&'a mut P>,17}1819impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for OptionVisitor<'_, P> {20type Value = DynamicEnum;2122fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {23formatter.write_str("reflected option value of type ")?;24formatter.write_str(self.enum_info.type_path())25}2627fn visit_none<E>(self) -> Result<Self::Value, E>28where29E: Error,30{31let mut option = DynamicEnum::default();32option.set_variant("None", ());33Ok(option)34}3536fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>37where38D: serde::Deserializer<'de>,39{40let variant_info = self.enum_info.variant("Some").unwrap();41match variant_info {42VariantInfo::Tuple(tuple_info) if tuple_info.field_len() == 1 => {43let field = tuple_info.field_at(0).unwrap();44let registration = try_get_registration(*field.ty(), self.registry)?;45let de = TypedReflectDeserializer::new_internal(46registration,47self.registry,48self.processor,49);50let mut value = DynamicTuple::default();51value.insert_boxed(de.deserialize(deserializer)?);52let mut option = DynamicEnum::default();53option.set_variant("Some", value);54Ok(option)55}56info => Err(make_custom_error(format_args!(57"invalid variant, expected `Some` but got `{}`",58info.name()59))),60}61}62}636465