miette_derive/
diagnostic_arg.rs

1use syn::parse::{Parse, ParseStream};
2
3use crate::code::Code;
4use crate::forward::Forward;
5use crate::help::Help;
6use crate::severity::Severity;
7use crate::url::Url;
8
9pub enum DiagnosticArg {
10    Transparent,
11    Code(Code),
12    Severity(Severity),
13    Help(Help),
14    Url(Url),
15    Forward(Forward),
16}
17
18impl Parse for DiagnosticArg {
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}