diff options
Diffstat (limited to 'arg_picker/src/builtin')
| -rw-r--r-- | arg_picker/src/builtin/pick_ip_attr.rs | 39 | ||||
| -rw-r--r-- | arg_picker/src/builtin/pick_pathbuf.rs | 18 | ||||
| -rw-r--r-- | arg_picker/src/builtin/pick_paths.rs | 167 | ||||
| -rw-r--r-- | arg_picker/src/builtin/pick_socket_attr.rs | 39 |
4 files changed, 263 insertions, 0 deletions
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_paths.rs b/arg_picker/src/builtin/pick_paths.rs new file mode 100644 index 0000000..8e6c0fd --- /dev/null +++ b/arg_picker/src/builtin/pick_paths.rs @@ -0,0 +1,167 @@ +use std::{ + fs, + path::{Path, PathBuf}, +}; + +use crate::{ + PickerArgResult::{self, NotFound, Parsed, Unparsed}, + SinglePickable, + value::{ + DirPath, FilePath, NoDirPath, NoFilePath, NoPath, NoSymlinkPath, RecursiveFiles, + SymlinkPath, + }, +}; + +impl SinglePickable for FilePath { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if path.exists() && path.is_file() { + Parsed(FilePath::from(path)) + } else { + NotFound + } + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +impl SinglePickable for NoFilePath { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if !path.exists() || !path.is_file() { + Parsed(NoFilePath::from(path)) + } else { + NotFound + } + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +impl SinglePickable for DirPath { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if path.exists() && path.is_dir() { + Parsed(DirPath::from(path)) + } else { + NotFound + } + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +impl SinglePickable for NoDirPath { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if !path.exists() || !path.is_dir() { + Parsed(NoDirPath::from(path)) + } else { + NotFound + } + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +impl SinglePickable for SymlinkPath { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if path.exists() && path.is_symlink() { + Parsed(SymlinkPath::from(path)) + } else { + NotFound + } + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +impl SinglePickable for NoSymlinkPath { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if !path.exists() || !path.is_symlink() { + Parsed(NoSymlinkPath::from(path)) + } else { + NotFound + } + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +impl SinglePickable for NoPath { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if !path.exists() { + Parsed(NoPath::from(path)) + } else { + NotFound + } + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +impl SinglePickable for RecursiveFiles { + fn pick_single(str: Option<&str>) -> PickerArgResult<Self> { + match <PathBuf as SinglePickable>::pick_single(str) { + Parsed(path) => { + if !path.exists() { + return NotFound; + } + if path.is_file() || path.is_symlink() { + return Parsed(RecursiveFiles::from(vec![path])); + } + let mut entries = Vec::new(); + if let Ok(dir_entries) = fs::read_dir(&path) { + for entry in dir_entries.flatten() { + let entry_path = entry.path(); + if entry_path.is_file() || entry_path.is_symlink() { + entries.push(entry_path); + } else if entry_path.is_dir() { + collect_files(&entry_path, &mut entries); + } + } + } + Parsed(RecursiveFiles::from(entries)) + } + Unparsed => Unparsed, + NotFound => NotFound, + } + } +} + +fn collect_files(dir: &Path, entries: &mut Vec<PathBuf>) { + if let Ok(dir_entries) = fs::read_dir(dir) { + for entry in dir_entries.flatten() { + let entry_path = entry.path(); + if entry_path.is_file() || entry_path.is_symlink() { + entries.push(entry_path); + } else if entry_path.is_dir() { + collect_files(&entry_path, entries); + } + } + } +} 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, + } + } +} |
