aboutsummaryrefslogtreecommitdiff
path: root/arg_picker
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-19 00:22:23 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-19 00:27:16 +0800
commit5e460470f6ea2ce31a403b6e936ec2fe8f45312a (patch)
treeec1d675d9544b31ab9382ebbd10bbeda43923cc8 /arg_picker
parent9b4cffd48482481691f782e74a4726294043bc57 (diff)
feat: migrate mingling-specific picker code into mingling crate
BREAKING CHANGE: Remove `mingling_support` feature from arg-picker crate. The `EntryPicker` trait and `corebind` module are now part of the mingling crate directly, and `build_pattern1` is now a public method.
Diffstat (limited to 'arg_picker')
-rw-r--r--arg_picker/Cargo.toml4
-rw-r--r--arg_picker/src/corebind/entry_picker.rs131
-rw-r--r--arg_picker/src/lib.rs14
-rw-r--r--arg_picker/src/picker.rs14
4 files changed, 12 insertions, 151 deletions
diff --git a/arg_picker/Cargo.toml b/arg_picker/Cargo.toml
index f7672c1..913719e 100644
--- a/arg_picker/Cargo.toml
+++ b/arg_picker/Cargo.toml
@@ -8,10 +8,6 @@ authors = ["Weicao-CatilGrass"]
readme = "README.md"
description = "A lightweight, type-safe CLI argument parser"
-[features]
-mingling_support = ["dep:mingling_core", "arg-picker-macros/mingling_support"]
-
[dependencies]
-mingling_core = { workspace = true, optional = true }
arg-picker-macros.workspace = true
just_fmt.workspace = true
diff --git a/arg_picker/src/corebind/entry_picker.rs b/arg_picker/src/corebind/entry_picker.rs
deleted file mode 100644
index d543f98..0000000
--- a/arg_picker/src/corebind/entry_picker.rs
+++ /dev/null
@@ -1,131 +0,0 @@
-use std::marker::PhantomData;
-
-use mingling_core::{ChainProcess, Groupped, ProgramCollect};
-
-use crate::{Pickable, Picker, PickerArg, PickerArgs, PickerPattern1};
-
-/// Trait for converting Mingling entry types (types that implement `Groupped<R>` and `Into<Vec<String>>`)
-/// into [`Picker`] instances for a given route type `R`.
-///
-/// This trait provides a bridge between entry definitions created with the `mingling` framework
-/// and the picker argument system used for CLI argument parsing and routing.
-///
-/// # Type Parameters
-///
-/// * `'a` — The lifetime of the picker and its references to argument definitions.
-/// * `This` — The program type used for dispatching runtime routes; must implement [`ProgramCollect`].
-/// * `Route` — The route type used for dispatching; must implement [`Groupped<This>`].
-pub trait EntryPicker<'a, This> {
- /// Converts `self` into a [`Picker`] for the given route type `Route`.
- fn to_picker(self) -> Picker<'a, ChainProcess<This>>;
-
- /// Starts building a picker pattern with the first argument.
- ///
- /// Returns a [`PickerPattern1`] that can be further chained with additional
- /// arguments, defaults, routes, and post-processing.
- ///
- /// # Type Parameters
- ///
- /// * `Next` — The nominal type of the first argument; must implement [`Pickable`].
- ///
- /// # Parameters
- ///
- /// * `arg` — The argument definition, typically obtained from [`crate::macros::arg`].
- fn pick<Next>(
- self,
- arg: impl Into<&'a PickerArg<'a, Next>>,
- ) -> PickerPattern1<'a, Next, ChainProcess<This>>
- where
- Self: Sized,
- Next: Pickable<'a> + Default + Sized,
- {
- let picker = Self::to_picker(self);
- Picker::build_pattern1(picker.args, arg.into(), None)
- }
-
- /// Starts building a picker pattern with the first argument, using a default value provider.
- ///
- /// This is a shorthand for calling `.pick(arg).or(func)`.
- ///
- /// # Type Parameters
- ///
- /// * `Next` — The nominal type of the first argument; must implement [`Pickable`].
- ///
- /// # Parameters
- ///
- /// * `arg` — The argument definition, typically obtained from [`crate::macros::arg`].
- /// * `func` — A closure that provides a default value if the arg is not provided by the user.
- fn pick_or<Next, F>(
- self,
- arg: impl Into<&'a PickerArg<'a, Next>>,
- func: F,
- ) -> PickerPattern1<'a, Next, ChainProcess<This>>
- where
- Self: Sized,
- Next: Pickable<'a> + Default + Sized,
- F: FnMut() -> Next + 'static,
- {
- self.pick(arg).or(func)
- }
-
- /// Starts building a picker pattern with the first argument, using a default value.
- ///
- /// This is a shorthand for calling `.pick(arg).or_default()`.
- ///
- /// # Type Parameters
- ///
- /// * `Next` — The nominal type of the first argument; must implement [`Pickable`] and [`Default`].
- ///
- /// # Parameters
- ///
- /// * `arg` — The argument definition, typically obtained from [`crate::macros::arg`].
- fn pick_or_default<Next>(
- self,
- arg: impl Into<&'a PickerArg<'a, Next>>,
- ) -> PickerPattern1<'a, Next, ChainProcess<This>>
- where
- Self: Sized,
- Next: Pickable<'a> + Default + Sized,
- {
- self.pick(arg).or_default()
- }
-
- /// Starts building a picker pattern with the first argument, using a route if the arg is not provided.
- ///
- /// This is a shorthand for calling `.pick(arg).or_route(func)`.
- ///
- /// # Type Parameters
- ///
- /// * `Next` — The nominal type of the first argument; must implement [`Pickable`].
- ///
- /// # Parameters
- ///
- /// * `arg` — The argument definition, typically obtained from [`crate::macros::arg`].
- /// * `func` — A closure that produces a route value if the arg is not provided by the user.
- fn pick_or_route<Next, F>(
- self,
- arg: impl Into<&'a PickerArg<'a, Next>>,
- func: F,
- ) -> PickerPattern1<'a, Next, ChainProcess<This>>
- where
- Self: Sized,
- Next: Pickable<'a> + Default + Sized,
- F: FnMut() -> ChainProcess<This> + 'static,
- {
- self.pick(arg).or_route(func)
- }
-}
-
-impl<'a, This, Bind> EntryPicker<'a, This> for Bind
-where
- This: ProgramCollect<Enum = This>,
- Bind: Groupped<This> + Into<Vec<String>>,
-{
- fn to_picker(self) -> Picker<'a, ChainProcess<This>> {
- let args = self.into();
- Picker {
- route_phantom: PhantomData,
- args: PickerArgs::Owned(args),
- }
- }
-}
diff --git a/arg_picker/src/lib.rs b/arg_picker/src/lib.rs
index 21a0d35..c65e793 100644
--- a/arg_picker/src/lib.rs
+++ b/arg_picker/src/lib.rs
@@ -29,13 +29,8 @@ pub mod value;
/// use arg_picker::prelude::*;
/// ```
pub mod prelude {
- pub use crate::macros::arg;
-
- #[cfg(not(feature = "mingling_support"))]
pub use crate::IntoPicker;
-
- #[cfg(feature = "mingling_support")]
- pub use crate::corebind::EntryPicker;
+ pub use crate::macros::arg;
}
/// Re-export of the `arg_picker_macros` crate
@@ -53,10 +48,3 @@ pub mod matcher_needed {
pub use crate::PickerArgInfo;
pub use crate::parselib::{MaskedArg, Matcher, ParserStyle};
}
-
-#[cfg(feature = "mingling_support")]
-mod corebind;
-
-#[allow(unused_imports)]
-#[cfg(feature = "mingling_support")]
-pub use corebind::*;
diff --git a/arg_picker/src/picker.rs b/arg_picker/src/picker.rs
index 7a60e16..f31a5b6 100644
--- a/arg_picker/src/picker.rs
+++ b/arg_picker/src/picker.rs
@@ -158,6 +158,15 @@ impl<'a> IntoIterator for &'a PickerArgs<'a> {
}
}
+impl<'a, Route> From<PickerArgs<'a>> for Picker<'a, Route> {
+ fn from(args: PickerArgs<'a>) -> Self {
+ Picker {
+ route_phantom: PhantomData,
+ args,
+ }
+ }
+}
+
impl<'a, Route> From<&'a [&'a str]> for Picker<'a, Route> {
fn from(value: &'a [&'a str]) -> Self {
Picker {
@@ -428,10 +437,9 @@ impl<'a> IntoPicker<'a> for Vec<String> {
}
}
-// Private helper: shared construction logic for `PickerPattern1`.
-// Both `Picker::pick` and `IntoPicker::pick` delegate to this.
impl<'a, Route> Picker<'a, Route> {
- pub(crate) fn build_pattern1<N>(
+ /// Build the PickerPattern via Arguments
+ pub fn build_pattern1<N>(
args: PickerArgs<'a>,
arg: &'a PickerArg<'a, N>,
error_route: Option<Route>,