mirror of
https://github.com/Start9Labs/rpc-toolkit.git
synced 2026-03-30 12:21:58 +00:00
serde style defaults
This commit is contained in:
@@ -293,9 +293,9 @@ fn build_app(name: LitStr, opt: &mut Options, params: &mut [ParamType]) -> Token
|
|||||||
modifications.extend(quote_spanned! { ty_span =>
|
modifications.extend(quote_spanned! { ty_span =>
|
||||||
arg = arg.takes_value(true);
|
arg = arg.takes_value(true);
|
||||||
});
|
});
|
||||||
if let Some(default) = &arg.default {
|
if let Some(_) = &arg.default {
|
||||||
modifications.extend(quote_spanned! { ty_span =>
|
modifications.extend(quote_spanned! { ty_span =>
|
||||||
arg = arg.default_value(#default);
|
arg = arg.required(false);
|
||||||
});
|
});
|
||||||
} else if p.path.segments.last().unwrap().ident == "Option" {
|
} else if p.path.segments.last().unwrap().ident == "Option" {
|
||||||
arg.optional = true;
|
arg.optional = true;
|
||||||
@@ -485,10 +485,26 @@ fn rpc_handler(
|
|||||||
.unwrap_or_else(|| LitStr::new(&name.to_string(), name.span()));
|
.unwrap_or_else(|| LitStr::new(&name.to_string(), name.span()));
|
||||||
let field_name = Ident::new(&format!("arg_{}", name), name.span());
|
let field_name = Ident::new(&format!("arg_{}", name), name.span());
|
||||||
let ty = arg.ty.clone();
|
let ty = arg.ty.clone();
|
||||||
param_def.push(quote! {
|
let def = quote! {
|
||||||
#[serde(rename = #rename)]
|
#[serde(rename = #rename)]
|
||||||
#field_name: #ty,
|
#field_name: #ty,
|
||||||
})
|
};
|
||||||
|
let def = match &arg.default {
|
||||||
|
Some(Some(default)) => {
|
||||||
|
quote! {
|
||||||
|
#[serde(default = #default)]
|
||||||
|
#def
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(None) => {
|
||||||
|
quote! {
|
||||||
|
#[serde(default)]
|
||||||
|
#def
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => def,
|
||||||
|
};
|
||||||
|
param_def.push(def);
|
||||||
}
|
}
|
||||||
ParamType::ParentData(ty) => parent_data_ty = quote! { #ty },
|
ParamType::ParentData(ty) => parent_data_ty = quote! { #ty },
|
||||||
_ => (),
|
_ => (),
|
||||||
@@ -780,6 +796,10 @@ fn cli_handler(
|
|||||||
.unwrap_or_else(|| LitStr::new(&name.to_string(), name.span()));
|
.unwrap_or_else(|| LitStr::new(&name.to_string(), name.span()));
|
||||||
let field_name = Ident::new(&format!("arg_{}", name), name.span());
|
let field_name = Ident::new(&format!("arg_{}", name), name.span());
|
||||||
let ty = arg.ty.clone();
|
let ty = arg.ty.clone();
|
||||||
|
let mut ty = quote! { #ty };
|
||||||
|
if arg.default.is_some() && !arg.optional {
|
||||||
|
ty = quote! { Option<#ty> };
|
||||||
|
}
|
||||||
arg_def.push(quote! {
|
arg_def.push(quote! {
|
||||||
#[serde(rename = #rename)]
|
#[serde(rename = #rename)]
|
||||||
#field_name: #ty,
|
#field_name: #ty,
|
||||||
@@ -829,7 +849,7 @@ fn cli_handler(
|
|||||||
::rpc_toolkit::command_helpers::prelude::default_arg_parser(arg_val, matches)
|
::rpc_toolkit::command_helpers::prelude::default_arg_parser(arg_val, matches)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if arg.optional {
|
if arg.optional || arg.default.is_some() {
|
||||||
quote! {
|
quote! {
|
||||||
#field_name: if let Some(arg_val) = matches.value_of(#arg_name) {
|
#field_name: if let Some(arg_val) = matches.value_of(#arg_name) {
|
||||||
Some(#parse_val?)
|
Some(#parse_val?)
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ pub struct ArgOptions {
|
|||||||
short: Option<LitChar>,
|
short: Option<LitChar>,
|
||||||
long: Option<LitStr>,
|
long: Option<LitStr>,
|
||||||
parse: Option<Path>,
|
parse: Option<Path>,
|
||||||
default: Option<LitStr>,
|
default: Option<Option<LitStr>>,
|
||||||
count: Option<Path>,
|
count: Option<Path>,
|
||||||
multiple: Option<Path>,
|
multiple: Option<Path>,
|
||||||
stdin: Option<Path>,
|
stdin: Option<Path>,
|
||||||
|
|||||||
@@ -785,7 +785,7 @@ pub fn parse_arg_attr(attr: Attribute, arg: PatType) -> Result<ArgOptions> {
|
|||||||
"duplicate argument `default`",
|
"duplicate argument `default`",
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
opt.default = Some(default);
|
opt.default = Some(Some(default));
|
||||||
} else {
|
} else {
|
||||||
return Err(Error::new(nv.lit.span(), "`default` must be a string"));
|
return Err(Error::new(nv.lit.span(), "`default` must be a string"));
|
||||||
}
|
}
|
||||||
@@ -797,7 +797,10 @@ pub fn parse_arg_attr(attr: Attribute, arg: PatType) -> Result<ArgOptions> {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
NestedMeta::Meta(Meta::Path(p)) if p.is_ident("default") => {
|
NestedMeta::Meta(Meta::Path(p)) if p.is_ident("default") => {
|
||||||
return Err(Error::new(p.span(), "`default` must be assigned to"));
|
if opt.default.is_some() {
|
||||||
|
return Err(Error::new(p.span(), "duplicate argument `default`"));
|
||||||
|
}
|
||||||
|
opt.default = Some(None);
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(Error::new(arg.span(), "unknown argument"));
|
return Err(Error::new(arg.span(), "unknown argument"));
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ async fn dothething<
|
|||||||
#[context] _ctx: AppState,
|
#[context] _ctx: AppState,
|
||||||
#[arg(short = 'a')] arg1: Option<String>,
|
#[arg(short = 'a')] arg1: Option<String>,
|
||||||
#[arg(short = 'b')] val: String,
|
#[arg(short = 'b')] val: String,
|
||||||
#[arg(short = 'c', help = "I am the flag `c`!")] arg3: bool,
|
#[arg(short = 'c', help = "I am the flag `c`!", default)] arg3: bool,
|
||||||
#[arg(stdin)] structured: U,
|
#[arg(stdin)] structured: U,
|
||||||
) -> Result<(Option<String>, String, bool, U), RpcError> {
|
) -> Result<(Option<String>, String, bool, U), RpcError> {
|
||||||
Ok((arg1, val, arg3, structured))
|
Ok((arg1, val, arg3, structured))
|
||||||
|
|||||||
Reference in New Issue
Block a user