From f043f575599555e3dae769b3fc9fdac440114628 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 5 Jul 2023 09:53:41 -0500 Subject: [PATCH 1/4] feat(derive): Accept Box/Arc wrapped types --- clap_builder/src/builder/value_parser.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/clap_builder/src/builder/value_parser.rs b/clap_builder/src/builder/value_parser.rs index 4b095578941..ffe8d7b3f2e 100644 --- a/clap_builder/src/builder/value_parser.rs +++ b/clap_builder/src/builder/value_parser.rs @@ -2215,6 +2215,28 @@ impl ValueParserFactory for u64 { RangedU64ValueParser::new() } } +impl ValueParserFactory for Box +where + T: ValueParserFactory, + ::Parser: TypedValueParser, + T: Send + Sync + Clone, +{ + type Parser = MapValueParser<::Parser, fn(T) -> Box>; + fn value_parser() -> Self::Parser { + T::value_parser().map(Box::new) + } +} +impl ValueParserFactory for std::sync::Arc +where + T: ValueParserFactory, + ::Parser: TypedValueParser, + T: Send + Sync + Clone, +{ + type Parser = MapValueParser<::Parser, fn(T) -> std::sync::Arc>; + fn value_parser() -> Self::Parser { + T::value_parser().map(std::sync::Arc::new) + } +} #[doc(hidden)] #[derive(Debug)] From 916c8d93e1c9e54ee80178fa600c2d756635268e Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 5 Jul 2023 09:55:31 -0500 Subject: [PATCH 2/4] feat(derive): Accept num::Wrapping wrapped types --- clap_builder/src/builder/value_parser.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/clap_builder/src/builder/value_parser.rs b/clap_builder/src/builder/value_parser.rs index ffe8d7b3f2e..2e43d98f652 100644 --- a/clap_builder/src/builder/value_parser.rs +++ b/clap_builder/src/builder/value_parser.rs @@ -2215,6 +2215,17 @@ impl ValueParserFactory for u64 { RangedU64ValueParser::new() } } +impl ValueParserFactory for std::num::Wrapping +where + T: ValueParserFactory, + ::Parser: TypedValueParser, + T: Send + Sync + Clone, +{ + type Parser = MapValueParser<::Parser, fn(T) -> std::num::Wrapping>; + fn value_parser() -> Self::Parser { + T::value_parser().map(std::num::Wrapping) + } +} impl ValueParserFactory for Box where T: ValueParserFactory, From a50e32c1357b9a73da6c7b2d4506dd4be8f3420f Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 5 Jul 2023 10:03:52 -0500 Subject: [PATCH 3/4] feat(derive): Accept Boxed Str/OsStr/Path --- clap_builder/src/builder/value_parser.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/clap_builder/src/builder/value_parser.rs b/clap_builder/src/builder/value_parser.rs index 2e43d98f652..b1540e08a10 100644 --- a/clap_builder/src/builder/value_parser.rs +++ b/clap_builder/src/builder/value_parser.rs @@ -2137,18 +2137,38 @@ impl ValueParserFactory for String { ValueParser::string() // Default `clap_derive` to optimized implementation } } +impl ValueParserFactory for Box { + type Parser = MapValueParser Box>; + fn value_parser() -> Self::Parser { + StringValueParser::new().map(String::into_boxed_str) + } +} impl ValueParserFactory for std::ffi::OsString { type Parser = ValueParser; fn value_parser() -> Self::Parser { ValueParser::os_string() // Default `clap_derive` to optimized implementation } } +impl ValueParserFactory for Box { + type Parser = + MapValueParser Box>; + fn value_parser() -> Self::Parser { + OsStringValueParser::new().map(std::ffi::OsString::into_boxed_os_str) + } +} impl ValueParserFactory for std::path::PathBuf { type Parser = ValueParser; fn value_parser() -> Self::Parser { ValueParser::path_buf() // Default `clap_derive` to optimized implementation } } +impl ValueParserFactory for Box { + type Parser = + MapValueParser Box>; + fn value_parser() -> Self::Parser { + PathBufValueParser::new().map(std::path::PathBuf::into_boxed_path) + } +} impl ValueParserFactory for bool { type Parser = ValueParser; fn value_parser() -> Self::Parser { From 99bcdfc6c7262d01bbe4c9275acc46c339040fce Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 5 Jul 2023 10:10:34 -0500 Subject: [PATCH 4/4] style(builder): Be consistent in order --- clap_builder/src/builder/value_parser.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clap_builder/src/builder/value_parser.rs b/clap_builder/src/builder/value_parser.rs index b1540e08a10..c7c7e61eb5d 100644 --- a/clap_builder/src/builder/value_parser.rs +++ b/clap_builder/src/builder/value_parser.rs @@ -2223,18 +2223,18 @@ impl ValueParserFactory for i32 { RangedI64ValueParser::new().range(start..=end) } } -impl ValueParserFactory for i64 { - type Parser = RangedI64ValueParser; - fn value_parser() -> Self::Parser { - RangedI64ValueParser::new() - } -} impl ValueParserFactory for u64 { type Parser = RangedU64ValueParser; fn value_parser() -> Self::Parser { RangedU64ValueParser::new() } } +impl ValueParserFactory for i64 { + type Parser = RangedI64ValueParser; + fn value_parser() -> Self::Parser { + RangedI64ValueParser::new() + } +} impl ValueParserFactory for std::num::Wrapping where T: ValueParserFactory,