rpc_toolkit_macro_internals/run_cli/
parse.rs1use syn::parse::{Parse, ParseStream};
2
3use super::*;
4
5impl Parse for MakeCtx {
6 fn parse(input: ParseStream) -> Result<Self> {
7 let matches_ident = input.parse()?;
8 let _: token::FatArrow = input.parse()?;
9 let body = input.parse()?;
10 Ok(MakeCtx {
11 matches_ident,
12 body,
13 })
14 }
15}
16
17impl Parse for MutApp {
18 fn parse(input: ParseStream) -> Result<Self> {
19 let app_ident = input.parse()?;
20 let _: token::FatArrow = input.parse()?;
21 let body = input.parse()?;
22 Ok(MutApp { app_ident, body })
23 }
24}
25
26impl Parse for RunCliArgs {
27 fn parse(input: ParseStream) -> Result<Self> {
28 let args;
29 braced!(args in input);
30 let mut command = None;
31 let mut mut_app = None;
32 let mut make_ctx = None;
33 let mut parent_data = None;
34 let mut exit_fn = None;
35 while !args.is_empty() {
36 let arg_name: syn::Ident = args.parse()?;
37 let _: token::Colon = args.parse()?;
38 match arg_name.to_string().as_str() {
39 "command" => {
40 command = Some(args.parse()?);
41 }
42 "app" => {
43 mut_app = Some(args.parse()?);
44 }
45 "context" => {
46 make_ctx = Some(args.parse()?);
47 }
48 "parent_data" => {
49 parent_data = Some(args.parse()?);
50 }
51 "exit" => {
52 exit_fn = Some(args.parse()?);
53 }
54 _ => return Err(Error::new(arg_name.span(), "unknown argument")),
55 }
56 if !args.is_empty() {
57 let _: token::Comma = args.parse()?;
58 }
59 }
60 Ok(RunCliArgs {
61 command: command.expect("`command` is required"),
62 mut_app,
63 make_ctx,
64 parent_data,
65 exit_fn,
66 })
67 }
68}