use crate::parser::Argument;
use mingling_core::{EnumTag, Flag};
#[doc(hidden)]
pub mod builtin;
#[doc(hidden)]
pub mod bools;
pub struct Picker {
pub args: Argument,
}
impl Picker {
pub fn new(args: impl Into<Argument>) -> Picker {
Picker { args: args.into() }
}
pub fn pick<TNext>(mut self, val: impl Into<Flag>) -> Pick1<TNext>
where
TNext: Pickable<Output = TNext> + Default,
{
let v = TNext::pick(&mut self.args, val.into()).unwrap_or_default();
Pick1 {
args: self.args,
val_1: v,
}
}
pub fn pick_or<TNext>(mut self, val: impl Into<Flag>, or: impl Into<TNext>) -> Pick1<TNext>
where
TNext: Pickable<Output = TNext>,
{
let v = TNext::pick(&mut self.args, val.into()).unwrap_or(or.into());
Pick1 {
args: self.args,
val_1: v,
}
}
pub fn pick_or_route<TNext, R>(
mut self,
val: impl Into<Flag>,
route: R,
) -> PickWithRoute1<TNext, R>
where
TNext: Pickable<Output = TNext> + Default,
{
let v = match TNext::pick(&mut self.args, val.into()) {
Some(value) => value,
None => {
return PickWithRoute1 {
args: self.args,
val_1: TNext::default(),
route: Some(route),
};
}
};
PickWithRoute1 {
args: self.args,
val_1: v,
route: None,
}
}
pub fn require<TNext>(mut self, val: impl Into<Flag>) -> Option<Pick1<TNext>>
where
TNext: Pickable<Output = TNext>,
{
let v = TNext::pick(&mut self.args, val.into());
match v {
Some(s) => Some(Pick1 {
args: self.args,
val_1: s,
}),
None => None,
}
}
pub fn operate_args<F: FnOnce(Argument) -> Argument>(mut self, operation: F) -> Self {
self.args = operation(self.args);
self
}
}
impl<T: Into<Argument>> From<T> for Picker {
fn from(value: T) -> Self {
Picker::new(value)
}
}
pub trait Pickable {
type Output: Default;
fn pick(args: &mut Argument, flag: Flag) -> Option<Self::Output>;
}
macro_rules! define_pick_struct {
($n:ident $final:ident $final_val:ident $route_self:ident $($T:ident $val:ident),+ $(,)?) => {
#[doc(hidden)]
pub struct $n<$($T,)+>
where
$($T: Pickable,)+
{
#[allow(dead_code)]
args: Argument,
$(pub $val: $T,)+
}
impl<$($T,)+> $n<$($T,)+>
where
$($T: Pickable,)+
{
pub fn after<F>(mut self, mut edit: F) -> Self
where
F: FnMut($final) -> $final,
{
self.$final_val = edit(self.$final_val);
self
}
pub fn after_or_route<F, R>(mut self, mut edit: F) -> $route_self<$($T,)+ R>
where
F: FnMut(&$final) -> Result<$final, R>,
{
match edit(&self.$final_val) {
Ok(new_value) => {
self.$final_val = new_value;
$route_self {
args: self.args,
$($val: self.$val,)+
route: None,
}
}
Err(err_route) => {
$route_self {
args: self.args,
$($val: self.$val,)+
route: Some(err_route),
}
}
}
}
pub fn operate_args<F: FnOnce(Argument) -> Argument>(mut self, operation: F) -> Self {
self.args = operation(self.args);
self
}
}
};
}
define_pick_struct! { Pick1 T1 val_1 PickWithRoute1 T1 val_1 }
impl<T1> From<Pick1<T1>> for (T1,)
where
T1: Pickable,
{
fn from(pick: Pick1<T1>) -> Self {
(pick.val_1,)
}
}
impl<T1> Pick1<T1>
where
T1: Pickable,
{
pub fn unpack(self) -> T1 {
self.val_1
}
}
macro_rules! impl_pick_from_tuple {
($n:ident $($T:ident $val:ident),+) => {
impl<$($T,)+> From<$n<$($T,)+>> for ($($T,)+)
where
$($T: Pickable,)+
{
fn from(pick: $n<$($T,)+>) -> Self {
($(pick.$val,)+)
}
}
};
}
macro_rules! impl_pick_unpack_tuple {
($n:ident $($T:ident $val:ident),+) => {
impl<$($T,)+> $n<$($T,)+>
where
$($T: Pickable,)+
{
pub fn unpack(self) -> ($($T,)+) {
($(self.$val,)+)
}
}
};
}
define_pick_struct! { Pick2 T2 val_2 PickWithRoute2 T1 val_1, T2 val_2 }
impl_pick_from_tuple! { Pick2 T1 val_1, T2 val_2 }
impl_pick_unpack_tuple! { Pick2 T1 val_1, T2 val_2 }
define_pick_struct! { Pick3 T3 val_3 PickWithRoute3 T1 val_1, T2 val_2, T3 val_3 }
impl_pick_from_tuple! { Pick3 T1 val_1, T2 val_2, T3 val_3 }
impl_pick_unpack_tuple! { Pick3 T1 val_1, T2 val_2, T3 val_3 }
define_pick_struct! { Pick4 T4 val_4 PickWithRoute4 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
impl_pick_from_tuple! { Pick4 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
impl_pick_unpack_tuple! { Pick4 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
define_pick_struct! { Pick5 T5 val_5 PickWithRoute5 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
impl_pick_from_tuple! { Pick5 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
impl_pick_unpack_tuple! { Pick5 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
define_pick_struct! { Pick6 T6 val_6 PickWithRoute6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
impl_pick_from_tuple! { Pick6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
impl_pick_unpack_tuple! { Pick6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
define_pick_struct! { Pick7 T7 val_7 PickWithRoute7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
impl_pick_from_tuple! { Pick7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
impl_pick_unpack_tuple! { Pick7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
define_pick_struct! { Pick8 T8 val_8 PickWithRoute8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
impl_pick_from_tuple! { Pick8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
impl_pick_unpack_tuple! { Pick8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
define_pick_struct! { Pick9 T9 val_9 PickWithRoute9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
impl_pick_from_tuple! { Pick9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
impl_pick_unpack_tuple! { Pick9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
define_pick_struct! { Pick10 T10 val_10 PickWithRoute10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
impl_pick_from_tuple! { Pick10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
impl_pick_unpack_tuple! { Pick10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
define_pick_struct! { Pick11 T11 val_11 PickWithRoute11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
impl_pick_from_tuple! { Pick11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
impl_pick_unpack_tuple! { Pick11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
define_pick_struct! { Pick12 T12 val_12 PickWithRoute12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11, T12 val_12 }
impl_pick_from_tuple! { Pick12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11, T12 val_12 }
impl_pick_unpack_tuple! { Pick12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11, T12 val_12 }
#[doc(hidden)]
macro_rules! impl_pick_next {
($n:ident $next:ident $next_val:ident $route_next:ident $($T:ident $val:ident),+) => {
impl<$($T,)+> $n<$($T,)+>
where
$($T: Pickable,)+
{
pub fn pick<TNext>(mut self, val: impl Into<mingling_core::Flag>) -> $next<$($T,)+ TNext>
where
TNext: Pickable<Output = TNext> + Default,
{
let v = TNext::pick(&mut self.args, val.into()).unwrap_or_default();
$next {
args: self.args,
$($val: self.$val,)+
$next_val: v,
}
}
pub fn pick_or<TNext>(mut self, val: impl Into<mingling_core::Flag>, or: impl Into<TNext>) -> $next<$($T,)+ TNext>
where
TNext: Pickable<Output = TNext>,
{
let v = TNext::pick(&mut self.args, val.into()).unwrap_or(or.into());
$next {
args: self.args,
$($val: self.$val,)+
$next_val: v,
}
}
pub fn pick_or_route<TNext, R>(
mut self,
val: impl Into<mingling_core::Flag>,
route: R,
) -> $route_next<$($T,)+ TNext, R>
where
TNext: Pickable<Output = TNext> + Default,
{
let v = match TNext::pick(&mut self.args, val.into()) {
Some(value) => value,
None => {
return $route_next {
args: self.args,
$($val: self.$val,)+
$next_val: TNext::default(),
route: Some(route),
};
}
};
$route_next {
args: self.args,
$($val: self.$val,)+
$next_val: v,
route: None,
}
}
pub fn require<TNext>(mut self, val: impl Into<mingling_core::Flag>) -> Option<$next<$($T,)+ TNext>>
where
TNext: Pickable<Output = TNext>,
{
let v = TNext::pick(&mut self.args, val.into());
match v {
Some(s) => Some($next {
args: self.args,
$($val: self.$val,)+
$next_val: s,
}),
None => None,
}
}
}
};
}
impl_pick_next! { Pick1 Pick2 val_2 PickWithRoute2 T1 val_1 }
impl_pick_next! { Pick2 Pick3 val_3 PickWithRoute3 T1 val_1, T2 val_2 }
impl_pick_next! { Pick3 Pick4 val_4 PickWithRoute4 T1 val_1, T2 val_2, T3 val_3 }
impl_pick_next! { Pick4 Pick5 val_5 PickWithRoute5 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
impl_pick_next! { Pick5 Pick6 val_6 PickWithRoute6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
impl_pick_next! { Pick6 Pick7 val_7 PickWithRoute7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
impl_pick_next! { Pick7 Pick8 val_8 PickWithRoute8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
impl_pick_next! { Pick8 Pick9 val_9 PickWithRoute9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
impl_pick_next! { Pick9 Pick10 val_10 PickWithRoute10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
impl_pick_next! { Pick10 Pick11 val_11 PickWithRoute11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
impl_pick_next! { Pick11 Pick12 val_12 PickWithRoute12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
macro_rules! define_pick_with_route_struct {
($n:ident $final:ident $final_val:ident $($T:ident $val:ident),+) => {
#[doc(hidden)]
pub struct $n<$($T,)+ R>
where
$($T: Pickable,)+
{
#[allow(dead_code)]
args: Argument,
$(pub $val: $T,)+
route: Option<R>,
}
impl<$($T,)+ R> $n<$($T,)+ R>
where
$($T: Pickable,)+
{
pub fn after<F>(mut self, mut edit: F) -> Self
where
F: FnMut($final) -> $final,
{
self.$final_val = edit(self.$final_val);
self
}
pub fn after_or_route<F>(mut self, mut edit: F) -> Self
where
F: FnMut(&$final) -> Result<$final, R>,
{
let value = &self.$final_val;
match edit(value) {
Ok(new_value) => {
self.$final_val = new_value;
}
Err(err_route) => {
let new_route = match self.route {
Some(existing_route) => Some(existing_route),
None => Some(err_route),
};
self.route = new_route;
}
}
self
}
pub fn operate_args<F: FnOnce(Argument) -> Argument>(mut self, operation: F) -> Self {
self.args = operation(self.args);
self
}
}
};
}
macro_rules! impl_pick_with_route_from_tuple {
($n:ident $($T:ident $val:ident),+) => {
impl<$($T,)+ R> From<$n<$($T,)+ R>> for ($($T,)+)
where
$($T: Pickable,)+
{
fn from(pick: $n<$($T,)+ R>) -> Self {
($(pick.$val,)+)
}
}
};
}
macro_rules! impl_pick_with_route_unpack_tuple {
($n:ident $($T:ident $val:ident),+) => {
impl<$($T,)+ R> $n<$($T,)+ R>
where
$($T: Pickable,)+
{
pub fn unpack(self) -> Result<($($T,)+), R> {
match self.route {
Some(route) => Err(route),
None => Ok(($(self.$val,)+)),
}
}
pub fn unpack_directly(self) -> ($($T,)+) {
($(self.$val,)+)
}
}
};
}
define_pick_with_route_struct! { PickWithRoute1 T1 val_1 T1 val_1 }
impl<T1, R> From<PickWithRoute1<T1, R>> for (T1,)
where
T1: Pickable,
{
fn from(pick: PickWithRoute1<T1, R>) -> Self {
(pick.val_1,)
}
}
impl<T1, R> PickWithRoute1<T1, R>
where
T1: Pickable,
{
pub fn unpack(self) -> Result<T1, R> {
match self.route {
Some(route) => Err(route),
None => Ok(self.val_1),
}
}
pub fn unpack_directly(self) -> T1 {
self.val_1
}
}
define_pick_with_route_struct! { PickWithRoute2 T2 val_2 T1 val_1, T2 val_2 }
impl_pick_with_route_from_tuple! { PickWithRoute2 T1 val_1, T2 val_2 }
impl_pick_with_route_unpack_tuple! { PickWithRoute2 T1 val_1, T2 val_2 }
define_pick_with_route_struct! { PickWithRoute3 T3 val_3 T1 val_1, T2 val_2, T3 val_3 }
impl_pick_with_route_from_tuple! { PickWithRoute3 T1 val_1, T2 val_2, T3 val_3 }
impl_pick_with_route_unpack_tuple! { PickWithRoute3 T1 val_1, T2 val_2, T3 val_3 }
define_pick_with_route_struct! { PickWithRoute4 T4 val_4 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
impl_pick_with_route_from_tuple! { PickWithRoute4 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
impl_pick_with_route_unpack_tuple! { PickWithRoute4 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
define_pick_with_route_struct! { PickWithRoute5 T5 val_5 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
impl_pick_with_route_from_tuple! { PickWithRoute5 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
impl_pick_with_route_unpack_tuple! { PickWithRoute5 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
define_pick_with_route_struct! { PickWithRoute6 T6 val_6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
impl_pick_with_route_from_tuple! { PickWithRoute6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
impl_pick_with_route_unpack_tuple! { PickWithRoute6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
define_pick_with_route_struct! { PickWithRoute7 T7 val_7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
impl_pick_with_route_from_tuple! { PickWithRoute7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
impl_pick_with_route_unpack_tuple! { PickWithRoute7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
define_pick_with_route_struct! { PickWithRoute8 T8 val_8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
impl_pick_with_route_from_tuple! { PickWithRoute8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
impl_pick_with_route_unpack_tuple! { PickWithRoute8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
define_pick_with_route_struct! { PickWithRoute9 T9 val_9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
impl_pick_with_route_from_tuple! { PickWithRoute9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
impl_pick_with_route_unpack_tuple! { PickWithRoute9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
define_pick_with_route_struct! { PickWithRoute10 T10 val_10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
impl_pick_with_route_from_tuple! { PickWithRoute10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
impl_pick_with_route_unpack_tuple! { PickWithRoute10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
define_pick_with_route_struct! { PickWithRoute11 T11 val_11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
impl_pick_with_route_from_tuple! { PickWithRoute11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
impl_pick_with_route_unpack_tuple! { PickWithRoute11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
define_pick_with_route_struct! { PickWithRoute12 T12 val_12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11, T12 val_12 }
impl_pick_with_route_from_tuple! { PickWithRoute12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11, T12 val_12 }
impl_pick_with_route_unpack_tuple! { PickWithRoute12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11, T12 val_12 }
#[doc(hidden)]
macro_rules! impl_pick_with_route_next {
($n:ident $next:ident $next_val:ident $($T:ident $val:ident),+) => {
impl<$($T,)+ R> $n<$($T,)+ R>
where
$($T: Pickable,)+
{
pub fn pick<TNext>(mut self, val: impl Into<mingling_core::Flag>) -> $next<$($T,)+ TNext, R>
where
TNext: Pickable<Output = TNext> + Default,
{
let v = TNext::pick(&mut self.args, val.into()).unwrap_or_default();
$next {
args: self.args,
$($val: self.$val,)+
$next_val: v,
route: self.route,
}
}
pub fn pick_or<TNext>(mut self, val: impl Into<mingling_core::Flag>, or: impl Into<TNext>) -> $next<$($T,)+ TNext, R>
where
TNext: Pickable<Output = TNext>,
{
let v = TNext::pick(&mut self.args, val.into()).unwrap_or(or.into());
$next {
args: self.args,
$($val: self.$val,)+
$next_val: v,
route: self.route,
}
}
pub fn pick_or_route<TNext>(mut self, val: impl Into<mingling_core::Flag>, route: R) -> $next<$($T,)+ TNext, R>
where
TNext: Pickable<Output = TNext> + Default,
{
let v = match TNext::pick(&mut self.args, val.into()) {
Some(value) => value,
None => {
let new_route = match self.route {
Some(existing_route) => Some(existing_route),
None => Some(route),
};
return $next {
args: self.args,
$($val: self.$val,)+
$next_val: TNext::default(),
route: new_route,
};
}
};
$next {
args: self.args,
$($val: self.$val,)+
$next_val: v,
route: self.route,
}
}
pub fn require<TNext>(mut self, val: impl Into<mingling_core::Flag>) -> Option<$next<$($T,)+ TNext, R>>
where
TNext: Pickable<Output = TNext>,
{
let v = TNext::pick(&mut self.args, val.into());
match v {
Some(s) => Some($next {
args: self.args,
$($val: self.$val,)+
$next_val: s,
route: self.route,
}),
None => None,
}
}
}
};
}
impl_pick_with_route_next! { PickWithRoute1 PickWithRoute2 val_2 T1 val_1 }
impl_pick_with_route_next! { PickWithRoute2 PickWithRoute3 val_3 T1 val_1, T2 val_2 }
impl_pick_with_route_next! { PickWithRoute3 PickWithRoute4 val_4 T1 val_1, T2 val_2, T3 val_3 }
impl_pick_with_route_next! { PickWithRoute4 PickWithRoute5 val_5 T1 val_1, T2 val_2, T3 val_3, T4 val_4 }
impl_pick_with_route_next! { PickWithRoute5 PickWithRoute6 val_6 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5 }
impl_pick_with_route_next! { PickWithRoute6 PickWithRoute7 val_7 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6 }
impl_pick_with_route_next! { PickWithRoute7 PickWithRoute8 val_8 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7 }
impl_pick_with_route_next! { PickWithRoute8 PickWithRoute9 val_9 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8 }
impl_pick_with_route_next! { PickWithRoute9 PickWithRoute10 val_10 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9 }
impl_pick_with_route_next! { PickWithRoute10 PickWithRoute11 val_11 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10 }
impl_pick_with_route_next! { PickWithRoute11 PickWithRoute12 val_12 T1 val_1, T2 val_2, T3 val_3, T4 val_4, T5 val_5, T6 val_6, T7 val_7, T8 val_8, T9 val_9, T10 val_10, T11 val_11 }
pub trait PickableEnum: EnumTag + Default {}
impl<T> Pickable for T
where
T: PickableEnum,
{
type Output = T;
fn pick(args: &mut Argument, flag: Flag) -> Option<Self::Output> {
let name = args.pick_argument(flag)?;
T::build_enum(name)
}
}
pub trait AsPicker
where
Self: Into<Vec<String>>,
{
fn as_picker(self) -> Picker
where
Self: Sized,
Vec<String>: From<Self>,
{
let vec: Vec<String> = self.into();
Picker { args: vec.into() }
}
fn pick<TNext>(self, val: impl Into<Flag>) -> Pick1<TNext>
where
Self: Sized,
TNext: Pickable<Output = TNext> + Default,
{
let vec: Vec<String> = self.into();
let picker: Picker = vec.into();
picker.pick(val)
}
fn pick_or<TNext>(self, val: impl Into<Flag>, or: impl Into<TNext>) -> Pick1<TNext>
where
TNext: Pickable<Output = TNext>,
{
let vec: Vec<String> = self.into();
let picker: Picker = vec.into();
picker.pick_or(val, or)
}
fn pick_or_route<TNext, R>(self, val: impl Into<Flag>, route: R) -> PickWithRoute1<TNext, R>
where
TNext: Pickable<Output = TNext> + Default,
{
let vec: Vec<String> = self.into();
let picker: Picker = vec.into();
picker.pick_or_route(val, route)
}
}
impl<T> AsPicker for T
where
T: Sized,
Vec<String>: From<T>,
{
}