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
43
44
45
46
47
48
49
50
use syn::parse::{Parse, ParseStream};
use syn::punctuated::Punctuated;

use super::*;

impl Parse for RpcServerArgs {
    fn parse(input: ParseStream) -> Result<Self> {
        let args;
        braced!(args in input);
        let mut command = None;
        let mut ctx = None;
        let mut parent_data = None;
        let mut status_fn = None;
        let mut middleware = Punctuated::new();
        while !args.is_empty() {
            let arg_name: syn::Ident = args.parse()?;
            let _: token::Colon = args.parse()?;
            match arg_name.to_string().as_str() {
                "command" => {
                    command = Some(args.parse()?);
                }
                "context" => {
                    ctx = Some(args.parse()?);
                }
                "parent_data" => {
                    parent_data = Some(args.parse()?);
                }
                "status" => {
                    status_fn = Some(args.parse()?);
                }
                "middleware" => {
                    let middlewares;
                    bracketed!(middlewares in args);
                    middleware = middlewares.parse_terminated(Expr::parse)?;
                }
                _ => return Err(Error::new(arg_name.span(), "unknown argument")),
            }
            if !args.is_empty() {
                let _: token::Comma = args.parse()?;
            }
        }
        Ok(RpcServerArgs {
            command: command.expect("`command` is required"),
            ctx: ctx.expect("`context` is required"),
            parent_data,
            status_fn,
            middleware,
        })
    }
}