Path: blob/main/crates/bevy_reflect/src/serde/de/helpers.rs
6600 views
use alloc::{1string::{String, ToString},2vec::Vec,3};4use core::{5fmt,6fmt::{Debug, Display, Formatter},7};8use serde::{9de::{Error, Visitor},10Deserialize,11};1213/// A debug struct used for error messages that displays a list of expected values.14///15/// # Example16///17/// ```ignore (Can't import private struct from doctest)18/// let expected = vec!["foo", "bar", "baz"];19/// assert_eq!("`foo`, `bar`, `baz`", format!("{}", ExpectedValues(expected)));20/// ```21pub(super) struct ExpectedValues<T: Display>(pub Vec<T>);2223impl<T: Display> FromIterator<T> for ExpectedValues<T> {24fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {25Self(iter.into_iter().collect())26}27}2829impl<T: Display> Debug for ExpectedValues<T> {30fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {31let len = self.0.len();32for (index, item) in self.0.iter().enumerate() {33write!(f, "`{item}`")?;34if index < len - 1 {35write!(f, ", ")?;36}37}38Ok(())39}40}4142/// Represents a simple reflected identifier.43#[derive(Debug, Clone, Eq, PartialEq)]44pub(super) struct Ident(pub String);4546impl<'de> Deserialize<'de> for Ident {47fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>48where49D: serde::Deserializer<'de>,50{51struct IdentVisitor;5253impl<'de> Visitor<'de> for IdentVisitor {54type Value = Ident;5556fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {57formatter.write_str("identifier")58}5960fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>61where62E: Error,63{64Ok(Ident(value.to_string()))65}6667fn visit_string<E>(self, value: String) -> Result<Self::Value, E>68where69E: Error,70{71Ok(Ident(value))72}73}7475deserializer.deserialize_identifier(IdentVisitor)76}77}787980