use core::cmp::Ordering; use core::hash::{Hash, Hasher};
// Currently serde itself doesn't have a spanned type, so we map our `Spanned` // to a special value in the serde data model. Namely one with these special // fields/struct names. // // In general, supported deserializers should catch this and not literally emit // these strings but rather emit `Spanned` as they're intended. #[cfg(feature = "serde")] pub(crate) const NAME: &str = "$__serde_spanned_private_Spanned"; #[cfg(feature = "serde")] pub(crate) const START_FIELD: &str = "$__serde_spanned_private_start"; #[cfg(feature = "serde")] pub(crate) const END_FIELD: &str = "$__serde_spanned_private_end"; #[cfg(feature = "serde")] pub(crate) const VALUE_FIELD: &str = "$__serde_spanned_private_value"; #[cfg(feature = "serde")] pub(crate) fn is_spanned(name: &'static str) -> bool {
name == NAME
}
/// A spanned value, indicating the range at which it is defined in the source. #[derive(Clone, Debug)] pubstruct Spanned<T> { /// Byte range
span: core::ops::Range<usize>, /// The spanned value.
value: T,
}
impl<T> Spanned<T> { /// Create a spanned value encompassing the given byte range. /// /// # Example /// /// Transposing a `Spanned<Enum<T>>` into `Enum<Spanned<T>>`: /// /// ``` /// use serde::de::{Deserialize, Deserializer}; /// use serde_untagged::UntaggedEnumVisitor; /// use toml::Spanned; /// /// pub enum Dependency { /// Simple(Spanned<String>), /// Detailed(Spanned<DetailedDependency>), /// } /// /// impl<'de> Deserialize<'de> for Dependency { /// fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> /// where /// D: Deserializer<'de>, /// { /// enum DependencyKind { /// Simple(String), /// Detailed(DetailedDependency), /// } /// /// impl<'de> Deserialize<'de> for DependencyKind { /// fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> /// where /// D: Deserializer<'de>, /// { /// UntaggedEnumVisitor::new() /// .expecting( /// "a version string like \"0.9.8\" or a \ /// detailed dependency like { version = \"0.9.8\" }", /// ) /// .string(|value| Ok(DependencyKind::Simple(value.to_owned()))) /// .map(|value| value.deserialize().map(DependencyKind::Detailed)) /// .deserialize(deserializer) /// } /// } /// /// let spanned: Spanned<DependencyKind> = Deserialize::deserialize(deserializer)?; /// let range = spanned.span(); /// Ok(match spanned.into_inner() { /// DependencyKind::Simple(simple) => Dependency::Simple(Spanned::new(range, simple)), /// DependencyKind::Detailed(detailed) => Dependency::Detailed(Spanned::new(range, detailed)), /// }) /// } /// } /// # /// # type DetailedDependency = std::collections::BTreeMap<String, String>; /// ``` pubfn new(range: core::ops::Range<usize>, value: T) -> Self { Self { span: range, value }
}
/// Byte range pubfn span(&self) -> core::ops::Range<usize> { self.span.clone()
}
/// Consumes the spanned value and returns the contained value. pubfn into_inner(self) -> T { self.value
}
/// Returns a reference to the contained value. pubfn get_ref(&self) -> &T {
&self.value
}
/// Returns a mutable reference to the contained value. pubfn get_mut(&mutself) -> &mut T {
&mutself.value
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.