haz-domain 0.2.0

Shared domain types for the haz task runner (identifiers, paths, errors).
Documentation
//! Output-mode workspace settings.
//!
//! Carries the executor's choice between live-streamed and
//! buffered task output (`EXEC-016`).

/// How the executor surfaces a running task's `stdout` and
/// `stderr` to the user.
///
/// `Default::default()` returns [`OutputMode::Live`], matching the
/// `CFG-030` default.
///
/// # Examples
///
/// ```
/// use haz_domain::settings::output::OutputMode;
///
/// assert_eq!(OutputMode::default(), OutputMode::Live);
/// assert_ne!(OutputMode::Live, OutputMode::Buffered);
/// ```
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub enum OutputMode {
    /// Stream stdout/stderr interleaved as they are produced
    /// (default).
    #[default]
    Live,
    /// Buffer stdout/stderr until the task terminates, then emit
    /// the buffered streams as a single block per task.
    Buffered,
}

/// Workspace-wide output settings.
///
/// `Default::default()` yields the `CFG-030` default
/// ([`OutputMode::Live`]); an absent `output` mapping in
/// `workspace.yml` is equivalent to this default.
///
/// # Examples
///
/// ```
/// use haz_domain::settings::output::{OutputMode, OutputSettings};
///
/// let os = OutputSettings::default();
/// assert_eq!(os.mode, OutputMode::Live);
/// ```
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct OutputSettings {
    /// How task output is surfaced (`EXEC-016`).
    pub mode: OutputMode,
}

#[cfg(test)]
mod tests {
    use crate::settings::output::{OutputMode, OutputSettings};

    #[test]
    fn output_mode_default_is_live() {
        assert_eq!(OutputMode::default(), OutputMode::Live);
    }

    #[test]
    fn output_mode_variants_are_distinct() {
        assert_ne!(OutputMode::Live, OutputMode::Buffered);
    }

    #[test]
    fn output_settings_default_is_live() {
        assert_eq!(OutputSettings::default().mode, OutputMode::Live);
    }

    #[test]
    fn output_settings_carry_chosen_mode() {
        let os = OutputSettings {
            mode: OutputMode::Buffered,
        };
        assert_eq!(os.mode, OutputMode::Buffered);
    }
}