diff --git a/rpc-toolkit-macro-internals/Cargo.toml b/rpc-toolkit-macro-internals/Cargo.toml index 977fd8c..508a49c 100644 --- a/rpc-toolkit-macro-internals/Cargo.toml +++ b/rpc-toolkit-macro-internals/Cargo.toml @@ -5,6 +5,8 @@ name = "rpc-toolkit-macro-internals" version = "0.1.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +cli-cookies = [] [dependencies] proc-macro2 = "1.0.26" diff --git a/rpc-toolkit-macro-internals/src/command/build.rs b/rpc-toolkit-macro-internals/src/command/build.rs index 0d0f91f..72c15c3 100644 --- a/rpc-toolkit-macro-internals/src/command/build.rs +++ b/rpc-toolkit-macro-internals/src/command/build.rs @@ -225,7 +225,11 @@ fn build_app(name: LitStr, opt: &mut Options, params: &mut [ParamType]) -> Token modifications.extend(quote_spanned! { ty_span => arg = arg.takes_value(true); }); - if p.path.segments.last().unwrap().ident == "Option" { + if let Some(default) = &arg.default { + modifications.extend(quote_spanned! { ty_span => + arg = arg.default_value(#default); + }); + } else if p.path.segments.last().unwrap().ident == "Option" { arg.optional = true; modifications.extend(quote_spanned! { ty_span => arg = arg.required(false); diff --git a/rpc-toolkit-macro-internals/src/command/mod.rs b/rpc-toolkit-macro-internals/src/command/mod.rs index 3e458ac..9417e6c 100644 --- a/rpc-toolkit-macro-internals/src/command/mod.rs +++ b/rpc-toolkit-macro-internals/src/command/mod.rs @@ -81,6 +81,7 @@ pub struct ArgOptions { short: Option, long: Option, parse: Option, + default: Option, count: Option, multiple: Option, stdin: Option, diff --git a/rpc-toolkit-macro-internals/src/command/parse.rs b/rpc-toolkit-macro-internals/src/command/parse.rs index 3779101..a5f6f4b 100644 --- a/rpc-toolkit-macro-internals/src/command/parse.rs +++ b/rpc-toolkit-macro-internals/src/command/parse.rs @@ -394,6 +394,7 @@ pub fn parse_arg_attr(attr: Attribute, arg: PatType) -> Result { short: None, long: None, parse: None, + default: None, count: None, multiple: None, stdin: None, @@ -627,6 +628,28 @@ pub fn parse_arg_attr(attr: Attribute, arg: PatType) -> Result { NestedMeta::Meta(Meta::Path(p)) if p.is_ident("long") => { return Err(Error::new(p.span(), "`long` must be assigned to")); } + NestedMeta::Meta(Meta::NameValue(nv)) if nv.path.is_ident("default") => { + if let Lit::Str(default) = nv.lit { + if opt.default.is_some() { + return Err(Error::new( + default.span(), + "duplicate argument `default`", + )); + } + opt.default = Some(default); + } else { + return Err(Error::new(nv.lit.span(), "`default` must be a string")); + } + } + NestedMeta::Meta(Meta::List(list)) if list.path.is_ident("default") => { + return Err(Error::new( + list.path.span(), + "`default` does not take any arguments", + )); + } + NestedMeta::Meta(Meta::Path(p)) if p.is_ident("default") => { + return Err(Error::new(p.span(), "`default` must be assigned to")); + } _ => { return Err(Error::new(arg.span(), "unknown argument")); } diff --git a/rpc-toolkit-macro/Cargo.toml b/rpc-toolkit-macro/Cargo.toml index 45acc21..e6a759e 100644 --- a/rpc-toolkit-macro/Cargo.toml +++ b/rpc-toolkit-macro/Cargo.toml @@ -9,6 +9,9 @@ version = "0.1.0" [lib] proc-macro = true +[features] +cli-cookies = ["rpc-toolkit-macro-internals/cli-cookies"] + [dependencies] proc-macro2 = "1.0.1" rpc-toolkit-macro-internals = { path = "../rpc-toolkit-macro-internals" } diff --git a/rpc-toolkit/Cargo.toml b/rpc-toolkit/Cargo.toml index 9ac5c66..0d5bbba 100644 --- a/rpc-toolkit/Cargo.toml +++ b/rpc-toolkit/Cargo.toml @@ -8,18 +8,26 @@ version = "0.1.0" [features] cbor = ["serde_cbor"] default = ["cbor"] +cli-cookies = ["rpc-toolkit-macro/cli-cookies"] [dependencies] clap = "2.33.3" futures = "0.3.15" -hyper = { version="0.14.5", features=["server", "http1", "http2", "tcp", "stream", "client"] } +hyper = { version = "0.14.5", features = [ + "server", + "http1", + "http2", + "tcp", + "stream", + "client", +] } lazy_static = "1.4.0" -reqwest = { version="0.11.2" } -rpc-toolkit-macro = { path="../rpc-toolkit-macro" } -serde = { version="1.0.125", features=["derive"] } -serde_cbor = { version="0.11.1", optional=true } +reqwest = { version = "0.11.2" } +rpc-toolkit-macro = { path = "../rpc-toolkit-macro" } +serde = { version = "1.0.125", features = ["derive"] } +serde_cbor = { version = "0.11.1", optional = true } serde_json = "1.0.64" thiserror = "1.0.24" -tokio = { version="1.4.0", features=["full"] } +tokio = { version = "1.4.0", features = ["full"] } url = "2.2.1" -yajrc = { version="*", path="../../yajrc" } +yajrc = { version = "*", path = "../../yajrc" } diff --git a/rpc-toolkit/src/cli_helpers.rs b/rpc-toolkit/src/cli_helpers.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/rpc-toolkit/src/cli_helpers.rs @@ -0,0 +1 @@ + diff --git a/rpc-toolkit/src/lib.rs b/rpc-toolkit/src/lib.rs index 894cfad..3b16067 100644 --- a/rpc-toolkit/src/lib.rs +++ b/rpc-toolkit/src/lib.rs @@ -44,6 +44,8 @@ pub use {clap, hyper, reqwest, serde, serde_json, tokio, url, yajrc}; pub use crate::context::Context; pub use crate::metadata::Metadata; +#[cfg(feature = "cli-cookies")] +pub mod cli_helpers; pub mod command_helpers; mod context; mod metadata;