summaryrefslogtreecommitdiff
path: root/src/diagnostic_arg.rs
blob: bade6f03bae258b9282e08675a06071fc019682f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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<Self> {
        let ident = input.fork().parse::<syn::Ident>()?;
        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",
            ))
        }
    }
}