aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-20 13:19:38 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-20 13:19:38 +0800
commit45fc8cfd6ab75ce8f91f7ea32c78f46df345ec90 (patch)
tree857c10acf94574da3942d8433db32b260cd9a65b
parent09a83d5013ae4d403a0c873caa6300449c8f138a (diff)
feat(arg): add into_info conversion and flag formatting helpers
- Move PickerArg-to-PickerArgInfo conversion into an `into_info` method - Add `short_flag()` and `long_flag()` methods to PickerArgInfo
-rw-r--r--arg_picker/src/arg.rs31
-rw-r--r--arg_picker/src/infos.rs75
2 files changed, 82 insertions, 24 deletions
diff --git a/arg_picker/src/arg.rs b/arg_picker/src/arg.rs
index a352418..4fa21b5 100644
--- a/arg_picker/src/arg.rs
+++ b/arg_picker/src/arg.rs
@@ -1,4 +1,4 @@
-use crate::Pickable;
+use crate::{Pickable, PickerArgInfo};
use std::marker::PhantomData;
/// Represents a constraint definition for a parameter selection.
@@ -133,6 +133,35 @@ where
self.positional = positional;
self
}
+
+ /// Converts this `PickerArg` into a `PickerArgInfo` value.
+ ///
+ /// This is a convenience method equivalent to calling `PickerArgInfo::from(self)`.
+ pub fn into_info(self) -> PickerArgInfo<'a> {
+ let value = self;
+ let (long, alias) = match value.full.len() {
+ 0 => (None, None),
+ _ => {
+ let long = Some(value.full[0]);
+ let alias = if value.full.len() > 1 {
+ Some(value.full[1..].to_vec())
+ } else {
+ None
+ };
+ (long, alias)
+ }
+ };
+
+ PickerArgInfo {
+ short: value.short,
+ long,
+ alias,
+ positional: value.positional,
+ optional: false,
+ multi: false,
+ is_flag: false,
+ }
+ }
}
/// Describes the attribute (behavior) of a command-line parameter.
diff --git a/arg_picker/src/infos.rs b/arg_picker/src/infos.rs
index 074539a..c17b6a2 100644
--- a/arg_picker/src/infos.rs
+++ b/arg_picker/src/infos.rs
@@ -1,4 +1,4 @@
-use crate::{Pickable, PickerArg};
+use crate::{Pickable, PickerArg, parselib::ParserStyle};
/// Represents the result of parsing or looking up a value.
///
@@ -288,28 +288,7 @@ where
T: Pickable<'a>,
{
fn from(value: PickerArg<'a, T>) -> Self {
- let (long, alias) = match value.full.len() {
- 0 => (None, None),
- _ => {
- let long = Some(value.full[0]);
- let alias = if value.full.len() > 1 {
- Some(value.full[1..].to_vec())
- } else {
- None
- };
- (long, alias)
- }
- };
-
- Self {
- short: value.short,
- long,
- alias,
- positional: value.positional,
- optional: false,
- multi: false,
- is_flag: false,
- }
+ value.into_info()
}
}
@@ -437,6 +416,56 @@ impl<'a> PickerArgInfo<'a> {
self.is_flag = is_flag;
self
}
+
+ /// Returns the short flag string, e.g. `-n` for short `n`.
+ ///
+ /// Uses [`ParserStyle::global_style()`] to format the flag.
+ ///
+ /// # Returns
+ ///
+ /// - `Some(String)` if `self.short` is set.
+ /// - `None` if `self.short` is `None`.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use arg_picker::PickerArgInfo;
+ ///
+ /// let info = PickerArgInfo::new().with_short('n');
+ /// assert_eq!(info.short_flag(), Some("-n".to_string()));
+ ///
+ /// let info = PickerArgInfo::new();
+ /// assert_eq!(info.short_flag(), None);
+ /// ```
+ pub fn short_flag(&self) -> Option<String> {
+ let short = self.short?;
+ Some(ParserStyle::global_style().flag_string(short))
+ }
+
+ /// Returns the long flag string, e.g. `--name` for long `"name"`.
+ ///
+ /// Uses [`ParserStyle::global_style()`] to format the flag.
+ ///
+ /// # Returns
+ ///
+ /// - `Some(String)` if `self.long` is set.
+ /// - `None` if `self.long` is `None`.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use arg_picker::PickerArgInfo;
+ ///
+ /// let info = PickerArgInfo::new().with_long("name");
+ /// assert_eq!(info.long_flag(), Some("--name".to_string()));
+ ///
+ /// let info = PickerArgInfo::new();
+ /// assert_eq!(info.long_flag(), None);
+ /// ```
+ pub fn long_flag(&self) -> Option<String> {
+ let long = self.long?;
+ Some(ParserStyle::global_style().flag_string(long))
+ }
}
impl<'a> Default for PickerArgInfo<'a> {