aboutsummaryrefslogtreecommitdiff
path: root/mingling
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-04-13 21:54:24 +0800
committer魏曹先生 <1992414357@qq.com>2026-04-13 21:54:24 +0800
commit031771110c53ff903046c47882b418a5b4936d5b (patch)
treeaaeda5f6c08883234741f03852a9ad5fa10442e0 /mingling
parentd270e3b81486245c699fd5ca5138f82102d9d48b (diff)
Update example to use EnumTag and PickableEnum
Diffstat (limited to 'mingling')
-rw-r--r--mingling/src/example_docs.rs80
1 files changed, 44 insertions, 36 deletions
diff --git a/mingling/src/example_docs.rs b/mingling/src/example_docs.rs
index 1ee5118..dd3474c 100644
--- a/mingling/src/example_docs.rs
+++ b/mingling/src/example_docs.rs
@@ -108,10 +108,12 @@ pub mod example_basic {}
/// main.rs
/// ```ignore
/// use mingling::{
-/// AnyOutput, Groupped, ShellContext, Suggest,
-/// macros::{chain, completion, dispatcher, gen_program, r_println, renderer, suggest},
+/// AnyOutput, EnumTag, Groupped, ShellContext, Suggest,
+/// macros::{
+/// chain, completion, dispatcher, gen_program, r_println, renderer, suggest, suggest_enum,
+/// },
/// marker::NextProcess,
-/// parser::{Pickable, Picker},
+/// parser::{PickableEnum, Picker},
/// };
///
/// // Define dispatcher `FruitCommand`, directing subcommand "fruit" to `FruitEntry`
@@ -119,34 +121,26 @@ pub mod example_basic {}
///
/// #[completion(FruitEntry)]
/// fn comp_fruit_command(ctx: &ShellContext) -> Suggest {
-/// // When the user is filling "--name" for the first time
/// if ctx.filling_argument_first("--name") {
/// return suggest!();
/// }
-/// // When the user is filling "--type" for the first time
/// if ctx.filling_argument_first("--type") {
-/// return suggest! {
-/// "apple", "banana"
-/// };
+/// return suggest_enum!(FruitType);
/// }
-/// // When the user is typing an argument
/// if ctx.typing_argument() {
/// return suggest! {
/// "--name": "Fruit name",
/// "--type": "Fruit type"
/// }
-/// // Strip already typed arguments
/// .strip_typed_argument(ctx);
/// }
-///
-/// // Return empty suggestion, indicating Shell should not perform any completion logic
/// return suggest!();
/// }
///
/// #[tokio::main]
/// async fn main() {
/// let mut program = ThisProgram::new();
-/// program.with_dispatcher(CompletionDispatcher); // Add completion dispatcher
+/// program.with_dispatcher(CompletionDispatcher);
/// program.with_dispatcher(FruitCommand);
/// program.exec().await;
/// }
@@ -157,29 +151,34 @@ pub mod example_basic {}
/// fruit_type: FruitType,
/// }
///
-/// #[derive(Default, Debug)]
+/// #[derive(Default, Debug, EnumTag)]
/// enum FruitType {
+/// #[enum_desc("It's Apple")]
+/// #[enum_rename("apple")]
+/// FruitApple,
+///
+/// #[enum_desc("It's Banana")]
+/// #[enum_rename("banana")]
+/// FruitBanana,
+///
+/// #[enum_desc("It's Cherry")]
+/// #[enum_rename("cherry")]
+/// FruitCherry,
+///
+/// #[enum_desc("It's Date")]
+/// #[enum_rename("date")]
+/// FruitDate,
+///
+/// #[enum_desc("It's Elderberry")]
+/// #[enum_rename("elderberry")]
+/// FruitElderberry,
+///
/// #[default]
-/// Apple,
-/// Banana,
-/// Other(String),
+/// #[enum_rename("unknown")]
+/// Unknown,
/// }
///
-/// impl Pickable for FruitType {
-/// type Output = FruitType;
-///
-/// fn pick(args: &mut mingling::parser::Argument, flag: mingling::Flag) -> Option<Self::Output> {
-/// let name = args.pick_argument(flag);
-/// match name {
-/// Some(name) => match name.as_str() {
-/// "apple" => Some(FruitType::Apple),
-/// "banana" => Some(FruitType::Banana),
-/// other => Some(FruitType::Other(other.to_string())),
-/// },
-/// None => None,
-/// }
-/// }
-/// }
+/// impl PickableEnum for FruitType {}
///
/// #[chain]
/// async fn parse_fruit_info(prev: FruitEntry) -> NextProcess {
@@ -194,10 +193,19 @@ pub mod example_basic {}
///
/// #[renderer]
/// fn render_fruit(prev: FruitInfo) {
-/// if let FruitType::Other(other) = prev.fruit_type {
-/// r_println!("Fruit name: {}, Type: {:?} (Unknown)", prev.name, other);
-/// } else {
-/// r_println!("Fruit name: {}, Type: {:?}", prev.name, prev.fruit_type);
+/// match (prev.name.is_empty(), prev.fruit_type) {
+/// (true, FruitType::Unknown) => {
+/// r_println!("Fruit name is empty and type is unknown");
+/// }
+/// (true, fruit_type) => {
+/// r_println!("Fruit name is empty, Type: {:?}", fruit_type);
+/// }
+/// (false, FruitType::Unknown) => {
+/// r_println!("Fruit name: {}, Type is unknown", prev.name);
+/// }
+/// (false, fruit_type) => {
+/// r_println!("Fruit name: {}, Type: {:?}", prev.name, fruit_type);
+/// }
/// }
/// }
///