hni 0.0.3

ni-compatible package manager command router with node shim
Documentation
use std::fmt;

use crate::core::types::{NativeDenoTaskExecution, NativeLocalBinExecution, NativeScriptExecution};

pub(super) enum NativeDecision {
    Eligible(NativePlan),
    Ineligible(FallbackReason),
}

pub(super) enum NativePlan {
    Script(NativeScriptExecution),
    DenoTask(NativeDenoTaskExecution),
    LocalBin(NativeLocalBinExecution),
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) enum FallbackReason {
    DenoTask(String),
    MissingNearestDenoProject,
    MissingNearestPackage,
    YarnBerryPnp,
    MissingScript(String),
    UnsupportedScriptEnv {
        event_name: String,
        pattern: &'static str,
    },
    MissingLocalBin,
    MissingLocalBinCommand,
}

impl fmt::Display for FallbackReason {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::DenoTask(reason) => write!(f, "{reason}"),
            Self::MissingNearestDenoProject => {
                write!(f, "fast deno execution requires a nearest deno project")
            }
            Self::MissingNearestPackage => {
                write!(f, "fast script execution requires a nearest package.json")
            }
            Self::YarnBerryPnp => write!(
                f,
                "yarn berry Plug'n'Play does not expose node_modules/.bin; falling back to yarn execution"
            ),
            Self::MissingScript(script_name) => write!(
                f,
                "script '{script_name}' was not found in the nearest package.json"
            ),
            Self::UnsupportedScriptEnv {
                event_name,
                pattern,
            } => write!(
                f,
                "script '{event_name}' uses unsupported fast environment expansion ({pattern})"
            ),
            Self::MissingLocalBin => write!(
                f,
                "local binary not found in node_modules/.bin or package.json bin entries; falling back to package-manager exec"
            ),
            Self::MissingLocalBinCommand => {
                write!(f, "fast local bin execution requires a command")
            }
        }
    }
}