rpc_toolkit_macro_internals/rpc_handler/
parse.rs1use 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}