Struct ParseNestedMeta
struct ParseNestedMeta<'a> { ... }
Context for parsing a single property in the conventional syntax for structured attributes.
Examples
Refer to usage examples on the following two entry-points:
-
Attribute::parse_nested_metaif you have an entireAttributeto parse. Always use this if possible. Generally this is able to produce better error messages becauseAttributeholds span information for all of the delimiters therein. -
syn::meta::parserif you are implementing aproc_macro_attributemacro and parsing the arguments to the attribute macro, i.e. the ones written in the same attribute that dispatched the macro invocation. Rustc does not pass span information for the surrounding delimiters into the attribute macro invocation in this situation, so error messages might be less precise.
Fields
path: crate::path::Pathinput: crate::parse::ParseStream<'a>
Implementations
impl<'a> ParseNestedMeta<'a>
fn value(self: &Self) -> Result<ParseStream<'a>>Used when parsing
key = "value"syntax.All it does is advance
meta.inputpast the=sign in the input. You could accomplish the same effect by writingmeta.parse::<Token![=]>()?, so at most it is a minor convenience to usemeta.value()?.Example
use ; let attr: Attribute = parse_quote! ; // conceptually: if attr.path.is_ident # Okfn parse_nested_meta<impl FnMut(ParseNestedMeta) -> Result<()>: FnMut(ParseNestedMeta<'_>) -> Result<()>>(self: &Self, logic: impl FnMut(ParseNestedMeta<'_>) -> Result<()>) -> Result<()>Used when parsing
list(...)syntax if the content inside the nested parentheses is also expected to conform to Rust's structured attribute convention.Example
use ; let attr: Attribute = parse_quote! ; if attr.path.is_ident # OkCounterexample
If you don't need
parse_nested_meta's help in parsing the content written within the nested parentheses, keep in mind that you can always just parse it yourself from the exposed ParseStream. Rust syntax permits arbitrary tokens within those parentheses so for the crazier stuff,parse_nested_metais not what you want.use ; let attr: Attribute = parse_quote! ; let mut align: = None; if attr.path.is_ident # Okfn error<impl Display: Display>(self: &Self, msg: impl Display) -> ErrorReport that the attribute's content did not conform to expectations.
The span of the resulting error will cover
meta.pathand everything that has been parsed so far since it.There are 2 ways you might call this. First, if
meta.pathis not something you recognize:# use Attribute; # #In this case, it behaves exactly like
syn::Error::new_spanned(&meta.path, "message...").error: unsupported tea property --> src/main.rs:3:26 | 3 | #[tea(kind = "EarlGrey", wat = "foo")] | ^^^More usefully, the second place is if you've already parsed a value but have decided not to accept the value:
# use Attribute; # #error: tea kind must be a string literal, path, or macro --> src/main.rs:3:7 | 3 | #[tea(kind = async { replicator.await })] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Often you may want to use
syn::Error::new_spannedeven in this situation. In the above code, that would be:# use ; # #error: unsupported expression type for `kind` --> src/main.rs:3:14 | 3 | #[tea(kind = async { replicator.await })] | ^^^^^^^^^^^^^^^^^^^^^^^^^^
impl<'a> Freeze for ParseNestedMeta<'a>
impl<'a> RefUnwindSafe for ParseNestedMeta<'a>
impl<'a> Send for ParseNestedMeta<'a>
impl<'a> Sync for ParseNestedMeta<'a>
impl<'a> Unpin for ParseNestedMeta<'a>
impl<'a> UnwindSafe for ParseNestedMeta<'a>
impl<T> Any for ParseNestedMeta<'a>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for ParseNestedMeta<'a>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for ParseNestedMeta<'a>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for ParseNestedMeta<'a>
fn from(t: T) -> TReturns the argument unchanged.
impl<T, U> Into for ParseNestedMeta<'a>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for ParseNestedMeta<'a>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for ParseNestedMeta<'a>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>