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