diff options
| author | Weicao-CatilGrass <1992414357@qq.com> | 2026-05-23 17:44:17 +0800 |
|---|---|---|
| committer | Weicao-CatilGrass <1992414357@qq.com> | 2026-05-23 17:46:59 +0800 |
| commit | 4836fceada0d9a87a82e1f2b011b3f9f5956dc4c (patch) | |
| tree | f78abaff3cbb31781e6be42d97a25f4482415bd5 | |
| parent | e843405ecfee06ea158fb0070d4c70c2f228c82c (diff) | |
Add Default derive and Option Pickable implementation
| -rw-r--r-- | CHANGELOG.md | 4 | ||||
| -rw-r--r-- | mingling/src/parser/picker.rs | 1 | ||||
| -rw-r--r-- | mingling/src/parser/picker/builtin.rs | 13 |
3 files changed, 18 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b7bf1a..26fcabf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,10 @@ fn render_greeting(prev: Greeting, res: &MyRes) { } ``` +5. **\[picker\]** Implement `Pickable` for `Option<T>` + +Added `impl<T: Pickable<Output = T> + Default> Pickable for Option<T>`, allowing optional values to be directly parsed via `Pickable` without manually handling the `Option` wrapping logic. + #### **BREAKING CHANGES** (API CHANGES): 1. **\[core\]** Panic Unwind will not be supported when the `async` feature is enabled 2. **\[core\]** `modify_res` signature changed: now returns `Return` instead of `()` diff --git a/mingling/src/parser/picker.rs b/mingling/src/parser/picker.rs index 725d4e6..b0cdb70 100644 --- a/mingling/src/parser/picker.rs +++ b/mingling/src/parser/picker.rs @@ -14,6 +14,7 @@ pub mod path; /// /// The `Picker` struct holds parsed arguments and provides a fluent interface /// to extract values associated with specific flags. +#[derive(Default)] pub struct Picker { /// The parsed command-line arguments. pub args: Argument, diff --git a/mingling/src/parser/picker/builtin.rs b/mingling/src/parser/picker/builtin.rs index 9fbbfd1..e7a178d 100644 --- a/mingling/src/parser/picker/builtin.rs +++ b/mingling/src/parser/picker/builtin.rs @@ -60,6 +60,7 @@ impl Pickable for bool { } } +/// Special: parses a size string (e.g. "10MB") into a `usize` representing the number of bytes. impl Pickable for usize { type Output = usize; @@ -73,6 +74,7 @@ impl Pickable for usize { } } +/// Special: parses a comma-separated list of size strings (e.g. "10MB,20KB") into a `Vec<usize>`. impl Pickable for Vec<usize> { type Output = Vec<usize>; @@ -90,6 +92,7 @@ impl Pickable for Vec<usize> { } } +/// Special: dumps the remaining arguments into an `Argument` struct. impl Pickable for Argument { type Output = Argument; @@ -100,3 +103,13 @@ impl Pickable for Argument { Some(args.dump_remains().into()) } } + +/// Special: parses a single value of type `T` using the `Pickable` implementation for `T`, and wraps it in an `Option`. +impl<T: Pickable<Output = T> + Default> Pickable for Option<T> { + type Output = Option<T>; + + fn pick(args: &mut Argument, flag: mingling_core::Flag) -> Option<Self::Output> { + let r = T::pick(args, flag); + Some(r) + } +} |
