1 use syn::parse::{Parse, ParseStream}; 2 3 use crate::code::Code; 4 use crate::forward::Forward; 5 use crate::help::Help; 6 use crate::severity::Severity; 7 use crate::url::Url; 8 9 pub enum DiagnosticArg { 10 Transparent, 11 Code(Code), 12 Severity(Severity), 13 Help(Help), 14 Url(Url), 15 Forward(Forward), 16 } 17 18 impl Parse for DiagnosticArg { parse(input: ParseStream) -> syn::Result<Self>19 fn parse(input: ParseStream) -> syn::Result<Self> { 20 let ident = input.fork().parse::<syn::Ident>()?; 21 if ident == "transparent" { 22 // consume the token 23 let _: syn::Ident = input.parse()?; 24 Ok(DiagnosticArg::Transparent) 25 } else if ident == "forward" { 26 Ok(DiagnosticArg::Forward(input.parse()?)) 27 } else if ident == "code" { 28 Ok(DiagnosticArg::Code(input.parse()?)) 29 } else if ident == "severity" { 30 Ok(DiagnosticArg::Severity(input.parse()?)) 31 } else if ident == "help" { 32 Ok(DiagnosticArg::Help(input.parse()?)) 33 } else if ident == "url" { 34 Ok(DiagnosticArg::Url(input.parse()?)) 35 } else { 36 Err(syn::Error::new( 37 ident.span(), 38 "Unrecognized diagnostic option", 39 )) 40 } 41 } 42 } 43