aboutsummaryrefslogtreecommitdiff
path: root/arg_picker
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-26 03:03:16 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-26 03:03:16 +0800
commit2cb8893711b73ccde946ca83e01dc315a9294c23 (patch)
treec081d929c563a79e057fb319e6ceaf5fff51abfc /arg_picker
parent451d2889211ebbae4965d61b94ec422d88cfe6c4 (diff)
feat(arg_picker): add SinglePickable impls for network and path typesHEADmain
Implement SinglePickable for IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, and PathBuf
Diffstat (limited to 'arg_picker')
-rw-r--r--arg_picker/src/builtin.rs3
-rw-r--r--arg_picker/src/builtin/pick_ip_attr.rs39
-rw-r--r--arg_picker/src/builtin/pick_pathbuf.rs18
-rw-r--r--arg_picker/src/builtin/pick_socket_attr.rs39
4 files changed, 99 insertions, 0 deletions
diff --git a/arg_picker/src/builtin.rs b/arg_picker/src/builtin.rs
index 1c698ba..b51590d 100644
--- a/arg_picker/src/builtin.rs
+++ b/arg_picker/src/builtin.rs
@@ -1,5 +1,8 @@
mod pick_bool;
mod pick_flag;
+mod pick_ip_attr;
mod pick_numbers;
+mod pick_pathbuf;
mod pick_picker_args;
+mod pick_socket_attr;
mod pick_string;
diff --git a/arg_picker/src/builtin/pick_ip_attr.rs b/arg_picker/src/builtin/pick_ip_attr.rs
new file mode 100644
index 0000000..d68fa15
--- /dev/null
+++ b/arg_picker/src/builtin/pick_ip_attr.rs
@@ -0,0 +1,39 @@
+use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
+
+use crate::SinglePickable;
+
+impl SinglePickable for IpAddr {
+ fn pick_single(str: Option<&str>) -> crate::PickerArgResult<Self> {
+ match str {
+ Some(s) => match s.parse::<IpAddr>() {
+ Ok(addr) => crate::PickerArgResult::Parsed(addr),
+ Err(_) => crate::PickerArgResult::NotFound,
+ },
+ None => crate::PickerArgResult::NotFound,
+ }
+ }
+}
+
+impl SinglePickable for Ipv4Addr {
+ fn pick_single(str: Option<&str>) -> crate::PickerArgResult<Self> {
+ match str {
+ Some(s) => match s.parse::<Ipv4Addr>() {
+ Ok(addr) => crate::PickerArgResult::Parsed(addr),
+ Err(_) => crate::PickerArgResult::NotFound,
+ },
+ None => crate::PickerArgResult::NotFound,
+ }
+ }
+}
+
+impl SinglePickable for Ipv6Addr {
+ fn pick_single(str: Option<&str>) -> crate::PickerArgResult<Self> {
+ match str {
+ Some(s) => match s.parse::<Ipv6Addr>() {
+ Ok(addr) => crate::PickerArgResult::Parsed(addr),
+ Err(_) => crate::PickerArgResult::NotFound,
+ },
+ None => crate::PickerArgResult::NotFound,
+ }
+ }
+}
diff --git a/arg_picker/src/builtin/pick_pathbuf.rs b/arg_picker/src/builtin/pick_pathbuf.rs
new file mode 100644
index 0000000..3bd4410
--- /dev/null
+++ b/arg_picker/src/builtin/pick_pathbuf.rs
@@ -0,0 +1,18 @@
+use std::path::PathBuf;
+
+use crate::{
+ PickerArgResult::{NotFound, Parsed},
+ SinglePickable,
+};
+
+impl SinglePickable for PathBuf {
+ fn pick_single(str: Option<&str>) -> crate::PickerArgResult<Self> {
+ match str {
+ Some(str) => match just_fmt::fmt_path_str(str) {
+ Ok(formated) => Parsed(PathBuf::from(formated)),
+ Err(_) => NotFound,
+ },
+ None => NotFound,
+ }
+ }
+}
diff --git a/arg_picker/src/builtin/pick_socket_attr.rs b/arg_picker/src/builtin/pick_socket_attr.rs
new file mode 100644
index 0000000..0c0dd71
--- /dev/null
+++ b/arg_picker/src/builtin/pick_socket_attr.rs
@@ -0,0 +1,39 @@
+use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};
+
+use crate::SinglePickable;
+
+impl SinglePickable for SocketAddr {
+ fn pick_single(str: Option<&str>) -> crate::PickerArgResult<Self> {
+ match str {
+ Some(s) => match s.parse::<SocketAddr>() {
+ Ok(addr) => crate::PickerArgResult::Parsed(addr),
+ Err(_) => crate::PickerArgResult::NotFound,
+ },
+ None => crate::PickerArgResult::NotFound,
+ }
+ }
+}
+
+impl SinglePickable for SocketAddrV4 {
+ fn pick_single(str: Option<&str>) -> crate::PickerArgResult<Self> {
+ match str {
+ Some(s) => match s.parse::<SocketAddrV4>() {
+ Ok(addr) => crate::PickerArgResult::Parsed(addr),
+ Err(_) => crate::PickerArgResult::NotFound,
+ },
+ None => crate::PickerArgResult::NotFound,
+ }
+ }
+}
+
+impl SinglePickable for SocketAddrV6 {
+ fn pick_single(str: Option<&str>) -> crate::PickerArgResult<Self> {
+ match str {
+ Some(s) => match s.parse::<SocketAddrV6>() {
+ Ok(addr) => crate::PickerArgResult::Parsed(addr),
+ Err(_) => crate::PickerArgResult::NotFound,
+ },
+ None => crate::PickerArgResult::NotFound,
+ }
+ }
+}