/// A value and an associated position in source code. The main use case for this is /// to preserve position information to emit warnings from proc macros. You can use /// a `SpannedValue<T>` as a field in any struct that implements or derives any of /// `darling`'s core traits. /// /// To access the underlying value, use the struct's `Deref` implementation. /// /// # Defaulting /// This type is meant to be used in conjunction with attribute-extracted options, /// but the user may not always explicitly set those options in their source code. /// In this case, using `Default::default()` will create an instance which points /// to `Span::call_site()`. #[derive(Debug, Clone, Copy)] pubstruct SpannedValue<T> {
value: T,
span: Span,
}
/// Get the source code location referenced by this struct. pubfn span(&self) -> Span { self.span
}
/// Apply a mapping function to a reference to the spanned value. pubfn map_ref<U>(&self, map_fn: impl FnOnce(&T) -> U) -> SpannedValue<U> {
SpannedValue::new(map_fn(&self.value), self.span)
}
}
impl<T: FromMeta> FromMeta for SpannedValue<T> { fn from_meta(item: &syn::Meta) -> Result<Self> { let value = T::from_meta(item).map_err(|e| e.with_span(item))?; let span = match item { // Example: `#[darling(skip)]` as SpannedValue<bool> // should have the span pointing to the word `skip`.
syn::Meta::Path(path) => path.span(), // Example: `#[darling(attributes(Value))]` as a SpannedValue<Vec<String>> // should have the span pointing to the list contents.
syn::Meta::List(list) => list.tokens.span(), // Example: `#[darling(skip = true)]` as SpannedValue<bool> // should have the span pointing to the word `true`.
syn::Meta::NameValue(nv) => nv.value.span(),
};
impl<T: Spanned> From<T> for SpannedValue<T> { fn from(value: T) -> Self { let span = value.span();
SpannedValue::new(value, span)
}
}
#[cfg(test)] mod tests { usesuper::*; use proc_macro2::Span;
/// Make sure that `SpannedValue` can be seamlessly used as its underlying type. #[test] fn deref() { let test = SpannedValue::new("hello", Span::call_site());
assert_eq!("hello", test.trim());
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-23)
¤
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.