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