aboutsummaryrefslogtreecommitdiff
path: root/mingling/src/setups
diff options
context:
space:
mode:
Diffstat (limited to 'mingling/src/setups')
-rw-r--r--mingling/src/setups/confirm.rs (renamed from mingling/src/setups/confirmer.rs)22
-rw-r--r--mingling/src/setups/osc94.rs89
2 files changed, 100 insertions, 11 deletions
diff --git a/mingling/src/setups/confirmer.rs b/mingling/src/setups/confirm.rs
index 1824745..46ead36 100644
--- a/mingling/src/setups/confirmer.rs
+++ b/mingling/src/setups/confirm.rs
@@ -2,12 +2,12 @@ use mingling_core::{
Program, ProgramCollect, config, hook::ProgramHook, setup::ProgramSetup, this,
};
-use crate::res::Confirmer;
+use crate::res::ResConfirm;
-/// Confirmer setup for managing confirmation state
+/// Confirm setup for managing confirmation state
///
/// This Setup manages the confirmation flag within the program's resource
-/// store. It registers a [`Confirmer`] resource and sets up a hook that
+/// store. It registers a [`ResConfirm`] resource and sets up a hook that
/// checks the user's confirmation mode during program execution.
///
/// # Usage
@@ -19,18 +19,18 @@ use crate::res::Confirmer;
/// ```rust
/// # use mingling::MockProgramCollect as ThisProgram;
/// use mingling::Program;
-/// use mingling::setup::ConfirmerSetup;
+/// use mingling::setup::ConfirmSetup;
///
/// let mut program = Program::<ThisProgram>::new();
-/// program.with_setup(ConfirmerSetup);
+/// program.with_setup(ConfirmSetup);
/// ```
///
/// # Behavior
///
-/// - Registers a [`Confirmer`] resource that tracks confirmation state.
+/// - Registers a [`ResConfirm`] resource that tracks confirmation state.
/// - At the beginning of command execution, checks whether the user's
/// confirmation mode is set to `Skip`.
-/// - If confirmation is skipped, the [`Confirmer`] resource is updated
+/// - If confirmation is skipped, the [`ResConfirm`] resource is updated
/// to record the confirmed state.
///
/// # Notes
@@ -38,20 +38,20 @@ use crate::res::Confirmer;
/// - This Setup applies uniformly to all subcommands of the entire program.
/// - The confirmation state is determined by the global `config` setting;
/// it does not support per-command overrides.
-pub struct ConfirmerSetup;
+pub struct ConfirmSetup;
-impl<C> ProgramSetup<C> for ConfirmerSetup
+impl<C> ProgramSetup<C> for ConfirmSetup
where
C: ProgramCollect<Enum = C> + 'static,
{
fn setup(self, program: &mut Program<C>) {
- program.with_resource(Confirmer::new());
+ program.with_resource(ResConfirm::new());
program.with_hook(ProgramHook::empty().on_pre_dispatch::<_, ()>(|_| {
let p = this::<C>();
let confirmed = p.user_context.confirmation == config::ConfirmationMode::Skip;
if confirmed {
- p.modify_res(|c: &mut Confirmer| {
+ p.modify_res(|c: &mut ResConfirm| {
c.set_confirmed();
});
}
diff --git a/mingling/src/setups/osc94.rs b/mingling/src/setups/osc94.rs
new file mode 100644
index 0000000..b08312f
--- /dev/null
+++ b/mingling/src/setups/osc94.rs
@@ -0,0 +1,89 @@
+use mingling_core::{Program, ProgramCollect, setup::ProgramSetup};
+
+use crate::res::ResOSC94;
+
+/// `OSC 9;4` Setup for managing terminal progress notification state
+///
+/// This Setup manages the terminal's `OSC 9;4` protocol support state within the
+/// program's resource store. It registers an [`ResOSC94`] resource that tracks whether
+/// the current terminal supports the protocol, and provides a helper resource that
+/// can be used to send progress notification messages.
+///
+/// # Usage
+///
+/// This Setup can be registered using the
+/// [`Program`](https://docs.rs/mingling/latest/mingling/struct.Program.html)
+/// `with_setup` method, for example:
+///
+/// ```rust
+/// # use mingling::MockProgramCollect as ThisProgram;
+/// use mingling::Program;
+/// use mingling::setup::OSC94Setup;
+///
+/// let mut program = Program::<ThisProgram>::new();
+/// program.with_setup(OSC94Setup);
+/// ```
+///
+/// # Behavior
+///
+/// - Registers an [`ResOSC94`] resource that tracks whether the current terminal
+/// supports the `OSC 9;4` protocol.
+/// - The support check inspects various environment variables such as `TERM_PROGRAM`,
+/// `WT_SESSION`, `VTE_VERSION`, and `TERM`.
+///
+/// # Notes
+///
+/// - The support state is determined at setup time and stored in the resource store.
+/// - Use `OSC94Message` to construct and send progress notification messages.
+pub struct OSC94Setup;
+
+impl<C> ProgramSetup<C> for OSC94Setup
+where
+ C: ProgramCollect<Enum = C> + 'static,
+{
+ fn setup(self, program: &mut Program<C>) {
+ program.with_resource(ResOSC94 {
+ is_support: is_support_osc94(),
+ });
+ }
+}
+
+/// Check whether the current terminal environment supports the `OSC 9;4` protocol
+///
+/// This function inspects various environment variables to determine whether the
+/// current terminal supports Microsoft's
+/// [OSC 9;4 protocol](https://learn.microsoft.com/en-us/windows/terminal/tutorials/progress-bar-sequences),
+/// which allows sending task progress notifications via ANSI escape sequences.
+///
+/// Supported terminal environments include:
+/// - **`TERM_PROGRAM`**: `ghostty`, `WezTerm`, `iTerm.app`
+/// - **`WT_SESSION`**: Windows Terminal
+/// - **`VTE_VERSION`**: VTE-based terminals (such as GNOME Terminal, Konsole, etc.)
+/// - **`TERM`**: terminal emulators containing `xterm`
+///
+/// Returns `true` if the current terminal supports the `OSC 9;4` protocol, so that
+/// progress notification escape sequences can be safely sent.
+fn is_support_osc94() -> bool {
+ if let Ok(program) = std::env::var("TERM_PROGRAM") {
+ match program.as_str() {
+ "ghostty" | "WezTerm" | "iTerm.app" => return true,
+ _ => {}
+ }
+ }
+
+ if std::env::var("WT_SESSION").is_ok() {
+ return true;
+ }
+
+ if std::env::var("VTE_VERSION").is_ok() {
+ return true;
+ }
+
+ if let Ok(term) = std::env::var("TERM")
+ && term.contains("xterm")
+ {
+ return true;
+ }
+
+ false
+}