use syn::parse::{Parse, ParseStream}; use crate::code::Code; use crate::forward::Forward; use crate::help::Help; use crate::severity::Severity; use crate::url::Url; pub enum DiagnosticArg { Transparent, Code(Code), Severity(Severity), Help(Help), Url(Url), Forward(Forward), } impl Parse for DiagnosticArg { fn parse(input: ParseStream) -> syn::Result { let ident = input.fork().parse::()?; if ident == "transparent" { // consume the token let _: syn::Ident = input.parse()?; Ok(DiagnosticArg::Transparent) } else if ident == "forward" { Ok(DiagnosticArg::Forward(input.parse()?)) } else if ident == "code" { Ok(DiagnosticArg::Code(input.parse()?)) } else if ident == "severity" { Ok(DiagnosticArg::Severity(input.parse()?)) } else if ident == "help" { Ok(DiagnosticArg::Help(input.parse()?)) } else if ident == "url" { Ok(DiagnosticArg::Url(input.parse()?)) } else { Err(syn::Error::new( ident.span(), "Unrecognized diagnostic option", )) } } }