diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-07-15 16:08:16 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-07-15 16:14:15 +0800 |
| commit | a7a116110a80dee887ee2d9a2660fbff5e0cbc62 (patch) | |
| tree | 120f5f497d6ba169a57af8ea77fd8df7e8432b9d /mingling_picker/src/picker/parse.rs | |
| parent | c3e990a5c47dc8894899d774a0d89f089adec308 (diff) | |
feat(picker): add Route generic parameter for error routing
Diffstat (limited to 'mingling_picker/src/picker/parse.rs')
| -rw-r--r-- | mingling_picker/src/picker/parse.rs | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/mingling_picker/src/picker/parse.rs b/mingling_picker/src/picker/parse.rs index 8a55e03..ab72206 100644 --- a/mingling_picker/src/picker/parse.rs +++ b/mingling_picker/src/picker/parse.rs @@ -7,7 +7,9 @@ // P.S. If there's a better way, please let me know. Thanks! // -------------------------------------------------------------------------------------------- -use crate::{Pickable, PickerArgInfo, PickerArgs, PickerFlagAttr, PickerResult, TagPhaseContext}; +use crate::{ + Pickable, PickerArgInfo, PickerArgResult, PickerArgs, PickerFlagAttr, TagPhaseContext, +}; use mingling_picker_macros::internal_repeat; internal_repeat!(1..=32 => { @@ -19,7 +21,7 @@ internal_repeat!(1..=32 => { where (T$: Pickable<'a>,+) { #[allow(clippy::type_complexity)] - pub fn parse(mut self) -> PickerResult<((T$,+))> { + pub fn parse(mut self) -> PickerArgResult<((T$,+))> { // ArgInfos let arg_infos: [PickerArgInfo; $] = [ ( @@ -27,17 +29,16 @@ internal_repeat!(1..=32 => { +) ]; - // Read & sort attrs - let mut attrs: [ + let mut bundle: [ ( // Flag Attr PickerFlagAttr, // Tag Func - Box<dyn FnOnce(&PickerArgs<'a>) -> Vec<usize>>, + Option<Box<dyn FnOnce(&PickerArgs<'a>) -> Vec<usize>>>, // Pick Func - Box<dyn FnOnce(&[&str])>, + Option<Box<dyn FnOnce(&[&str])>>, // Index usize @@ -49,23 +50,23 @@ internal_repeat!(1..=32 => { T$::get_attr(self.flag_$), // Tag Func - Box::new(|args| { + Some(Box::new(|args| { let ctx = TagPhaseContext { arg_info: &arg_infos[$], args, }; T$::tag(ctx) - }), + })), // Pick Func - Box::new(|args| { + Some(Box::new(|args| { self.result_$ = match T$::pick(args) { - PickerResult::Parsed(mut value) => { + PickerArgResult::Parsed(mut value) => { // Postprocess if let Some(post) = self.post_$ { value = post(value); } - PickerResult::Parsed(value) + PickerArgResult::Parsed(value) }, other => { if let Some(get_default) = self.default_$ { @@ -76,14 +77,14 @@ internal_repeat!(1..=32 => { value = post(value); } - PickerResult::Parsed(value) + PickerArgResult::Parsed(value) } else { other } }, } - }), + })), // Index $ @@ -91,14 +92,14 @@ internal_repeat!(1..=32 => { +) ]; - // Sort by Attr Ord (descending) - attrs.sort_by(|a, b| b.0.cmp(&a.0)); + // Sort by Bundle Ord (descending) + bundle.sort_by(|a, b| b.0.cmp(&a.0)); // Parsing - for (_, tag_func, pick_func, _idx) in attrs { + for (_, tag_func, pick_func, _idx) in bundle { // Tag phase - let tagged = tag_func(&self.args); + let tagged = (tag_func.unwrap())(&self.args); let mut args_to_pick: Vec<&str> = vec![]; for i in tagged { @@ -107,13 +108,10 @@ internal_repeat!(1..=32 => { } // Pick phase - pick_func(args_to_pick.as_slice()); + (pick_func.unwrap())(args_to_pick.as_slice()); } - // Sort by Index Ord - attrs.sort_by(|a, b| a.3.cmp(&b.3)); - PickerResult::NotFound } } }); |
