pub enum Index {
Forward(usize),
Backward(usize),
List(Vec<usize>),
Except(Vec<usize>),
Range(usize, Option<usize>),
AnyWhere,
Null,
}Expand description
Index using for option match.
The index is the position of left arguments (non-option arguments, NOA) index.
§Example
foo.exe -a=value -b value pos1 --aopt=42 pos2 --bopt value pos3
| | | | | | | | |
| | | | | | | | NOA @3 or @-1
| | | | | | | value of --bopt
| | | | | | option --bopt
| | | | | NOA @2 or @-2
| | | | option --aopt and its value 42
| | | NOA @1
| | value of -b
| option -b
option -a and its valueFor option check, see SetChecker for more information.
Variants§
Forward(usize)
The forward index of NOA, fixed position.
§Example
For ["app", "--aopt", "--bopt=42", "pos1", "--copt", "pos2", "--dopt", "value", "pos3"]:
@1 will matching "pos1".
@2 will matching "pos2".
@3 will matching "pos3".
Backward(usize)
The backward index of NOA, floating position.
§Example
For ["app", "--aopt", "--bopt=42", "pos1", "--copt", "pos2", "--dopt", "value", "pos3"]:
@-1 will matching "pos2".
@-2 will matching "pos1".
@-3 will matching "app".
List(Vec<usize>)
The include list of forward index of NOA, fixed position.
§Example
For ["app", "--aopt", "--bopt=42", "pos1", "--copt", "pos2", "--dopt", "value", "pos3"]:
@[1,3] will matching "pos1" or "pos3".
@[1,2] will matching "pos1" or "pos2".
@[1,2,3] will matching "pos1", "pos2" or "pos3".
Except(Vec<usize>)
The exclude list of forward index of NOA, floating position.
§Example
For ["app", "--aopt", "--bopt=42", "pos1", "--copt", "pos2", "--dopt", "value", "pos3"]:
@-[1,3] will matching "pos2".
@-[3] will matching "pos1" or "pos2".
@-[2] will matching "pos1" or "pos3".
Range(usize, Option<usize>)
The NOA which index inside in given position range with format (m..n].
If range have upper limit, the index is fixed position otherwise it is floating position.
§Example
For ["app", "--aopt", "--bopt=42", "pos1", "--copt", "pos2", "--dopt", "value", "pos3"]:
@0.. will matching "app", "pos1", "pos2" or "pos3".
@2.. will matching "pos2", "pos3".
@1.. will matching "pos1", "pos2" or "pos3".
@..4 will matching "app", "pos1", "pos2" or "pos3".
@..2 will matching "app", "pos1".
@1..3 will matching "pos1", "pos2".
AnyWhere
The anywhere position of NOA, floating position.
§Example
For ["app", "--aopt", "--bopt=42", "pos1", "--copt", "pos2", "--dopt", "value", "pos3"]:
@* will matching "app", "pos1", "pos2" or "pos3".
Null
Implementations§
Source§impl Index
impl Index
pub fn parse(dat: &str) -> Result<Self, Error>
pub fn is_null(&self) -> bool
pub fn is_forward(&self) -> bool
pub fn is_backward(&self) -> bool
pub fn is_list(&self) -> bool
pub fn is_except(&self) -> bool
pub fn is_range(&self) -> bool
pub fn is_anywhere(&self) -> bool
pub fn to_help(&self) -> String
pub fn forward(index: usize) -> Self
pub fn backward(index: usize) -> Self
pub fn list(list: Vec<usize>) -> Self
pub fn except(list: Vec<usize>) -> Self
pub fn range(start: Option<usize>, end: Option<usize>) -> Self
pub fn anywhere() -> Self
pub fn null() -> Self
pub fn calc_index(&self, noa_index: usize, noa_count: usize) -> Option<usize>
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Index
impl<'de> Deserialize<'de> for Index
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Ord for Index
impl Ord for Index
Source§impl PartialOrd for Index
impl PartialOrd for Index
impl Eq for Index
impl StructuralPartialEq for Index
Auto Trait Implementations§
impl Freeze for Index
impl RefUnwindSafe for Index
impl Send for Index
impl Sync for Index
impl Unpin for Index
impl UnwindSafe for Index
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> ConstructIntoOp for T
impl<T> ConstructIntoOp for T
Source§fn into_box(self) -> WrappedTy<BoxedCtor<T>>
fn into_box(self) -> WrappedTy<BoxedCtor<T>>
Return a type that wraps Ctor with Box.
§Example
let re = b'+'
.or(b'-')
.then(u8::is_ascii_hexdigit)
.then(u8::is_ascii_hexdigit.repeat_times::<3>())
.pat()
.map(|v: &[u8]| String::from_utf8(v.to_vec()).map_err(|_| Error::Uid(0)))
.into_box();
assert_eq!(BytesCtx::new(b"+AE00").ctor(&re)?, "+AE00");
assert!(BytesCtx::new(b"-GH66").ctor(&re).is_err());
assert_eq!(BytesCtx::new(b"-83FD").ctor(&re)?, "-83FD");
Ok(())Source§fn into_rc(self) -> WrappedTy<Rc<T>>
fn into_rc(self) -> WrappedTy<Rc<T>>
Return a type that wrap Ctor with Rc.
§Example
color_eyre::install()?;
let year = char::is_ascii_digit.repeat_times::<4>();
let num = char::is_ascii_digit.repeat_times::<2>();
let date = year.sep_once("-", num.sep_once("-", num)).into_rc();
let time = num.sep_once(":", num.sep_once(":", num));
let datetime = date.clone().sep_once(" ", time);
assert_eq!(
CharsCtx::new("2024-01-08").ctor(&date)?,
("2024", ("01", "08"))
);
assert_eq!(
CharsCtx::new("2024-01-08 10:01:13").ctor(&datetime)?,
(("2024", ("01", "08")), ("10", ("01", "13")))
);
Ok(())Source§fn into_dyn<'a, 'b, C, M, O, H, A>(
self,
) -> WrappedTy<DynamicBoxedCtor<'a, 'b, C, M, O, H, A>>
fn into_dyn<'a, 'b, C, M, O, H, A>( self, ) -> WrappedTy<DynamicBoxedCtor<'a, 'b, C, M, O, H, A>>
§Example 2
color_eyre::install()?;
let num = u8::is_ascii_digit
.repeat_one()
.map(|v: &[u8]| String::from_utf8(v.to_vec()).map_err(|_| Error::Uid(0)))
.map(map::from_str::<usize>());
let num = num.clone().sep_once(b",", num);
let re = num.into_dyn();
assert_eq!(BytesCtx::new(b"3,0").ctor(&re)?, (3, 0));
assert_eq!(BytesCtx::new(b"2,1").ctor(&re)?, (2, 1));
assert_eq!(BytesCtx::new(b"0,3").ctor(&re)?, (0, 3));
Ok(())fn into_arc(self) -> WrappedTy<Arc<T>>
fn into_cell(self) -> WrappedTy<Cell<T>>
fn into_refcell(self) -> WrappedTy<RefCell<T>>
fn into_mutex(self) -> WrappedTy<Mutex<T>>
fn into_dyn_sync<'a, 'b, C, M, O, H, A>( self, ) -> WrappedTy<DynamicBoxedCtorSync<'a, 'b, C, M, O, H, A>>
fn into_dyn_arc<'a, 'b, C, M, O, H, A>( self, ) -> WrappedTy<DynamicArcCtor<'a, 'b, C, M, O, H, A>>
fn into_dyn_rc<'a, 'b, C, M, O, H, A>( self, ) -> WrappedTy<DynamicRcCtor<'a, 'b, C, M, O, H, A>>
Source§impl<'a, C, T> DynamicCreateCtorThenHelper<'a, C> for T
impl<'a, C, T> DynamicCreateCtorThenHelper<'a, C> for T
Source§fn dyn_then_ctor<F>(self, func: F) -> DynamicCreateCtorThen<C, T, F>
fn dyn_then_ctor<F>(self, func: F) -> DynamicCreateCtorThen<C, T, F>
Construct a new regex with Ctor implementation based on previous result.
§Example
let num = u8::is_ascii_digit
.repeat_one()
.map(|v: &[u8]| String::from_utf8(v.to_vec()).map_err(|_| Error::Uid(0)))
.map(map::from_str::<usize>());
let num = num.clone().sep_once(b",", num);
let re = num.dyn_then_ctor(|a: &(usize, usize)| {
// leave the a's type empty cause rustc reject compile
Ok(b'+'
.repeat_range(a.0..a.0 + 1)
.then(b'-'.repeat_range(a.1..a.1 + 1)))
});
assert_eq!(
BytesCtx::new(b"3,0+++").ctor(&re)?,
((3, 0), ([43, 43, 43].as_slice(), [].as_slice()))
);
assert_eq!(
BytesCtx::new(b"2,1++-").ctor(&re)?,
((2, 1), ([43, 43].as_slice(), [45].as_slice()))
);
assert_eq!(
BytesCtx::new(b"0,3---").ctor(&re)?,
((0, 3), ([].as_slice(), [45, 45, 45].as_slice()))
);
Ok(())