rpc_toolkit_macro_internals/rpc_handler/
parse.rs

1use syn::parse::{Parse, ParseStream};
2use syn::punctuated::Punctuated;
3
4use super::*;
5
6impl Parse for RpcHandlerArgs {
7    fn parse(input: ParseStream) -> Result<Self> {
8        let args;
9        braced!(args in input);
10        let mut command = None;
11        let mut ctx = None;
12        let mut parent_data = None;
13        let mut status_fn = None;
14        let mut middleware = Punctuated::new();
15        while !args.is_empty() {
16            let arg_name: syn::Ident = args.parse()?;
17            let _: token::Colon = args.parse()?;
18            match arg_name.to_string().as_str() {
19                "command" => {
20                    command = Some(args.parse()?);
21                }
22                "context" => {
23                    ctx = Some(args.parse()?);
24                }
25                "parent_data" => {
26                    parent_data = Some(args.parse()?);
27                }
28                "status" => {
29                    status_fn = Some(args.parse()?);
30                }
31                "middleware" => {
32                    let middlewares;
33                    bracketed!(middlewares in args);
34                    middleware = middlewares.parse_terminated(Expr::parse)?;
35                }
36                _ => return Err(Error::new(arg_name.span(), "unknown argument")),
37            }
38            if !args.is_empty() {
39                let _: token::Comma = args.parse()?;
40            }
41        }
42        Ok(RpcHandlerArgs {
43            command: command.expect("`command` is required"),
44            ctx: ctx.expect("`context` is required"),
45            parent_data,
46            status_fn,
47            middleware,
48        })
49    }
50}