haz-domain 0.2.0

Shared domain types for the haz task runner (identifiers, paths, errors).
Documentation
//! Workspace-wide settings: cache, concurrency, output, and
//! execution policy.
//!
//! Each sub-module owns one settings bag and its leaf value types.
//! The [`WorkspaceSettings`] aggregate gathers them as a single
//! field on the [`crate::workspace::Workspace`] aggregate root,
//! matching the structure of `.haz/workspace.yml` (`CFG-027` ..
//! `CFG-031`).

pub mod cache;
pub mod cache_clean;
pub mod concurrency;
pub mod execution;
pub mod output;

use crate::settings::cache::CacheSettings;
use crate::settings::concurrency::ConcurrencySettings;
use crate::settings::execution::ExecutionSettings;
use crate::settings::output::OutputSettings;

/// Workspace-wide settings.
///
/// `Default::default()` yields the spec defaults for every
/// sub-field (per `CFG-027` .. `CFG-031`), so an absent settings
/// mapping in `workspace.yml` is equivalent to a fully-defaulted
/// [`WorkspaceSettings`].
///
/// # Examples
///
/// ```
/// use haz_domain::settings::WorkspaceSettings;
/// use haz_domain::settings::cache::HashAlgo;
/// use haz_domain::settings::output::OutputMode;
///
/// let ws = WorkspaceSettings::default();
/// assert_eq!(ws.cache.hash, HashAlgo::Blake3);
/// assert_eq!(ws.output.mode, OutputMode::Live);
/// ```
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct WorkspaceSettings {
    /// Cache-related settings (`CFG-027`).
    pub cache: CacheSettings,
    /// Concurrency caps (`CFG-028`, `CFG-029`).
    pub concurrency: ConcurrencySettings,
    /// Output-mode settings (`CFG-030`).
    pub output: OutputSettings,
    /// Execution-policy settings (`CFG-031`).
    pub execution: ExecutionSettings,
}

#[cfg(test)]
mod tests {
    use std::time::Duration;

    use crate::settings::WorkspaceSettings;
    use crate::settings::cache::HashAlgo;
    use crate::settings::concurrency::ConcurrencyDefault;
    use crate::settings::output::OutputMode;

    #[test]
    fn default_workspace_settings_match_cfg_defaults() {
        let ws = WorkspaceSettings::default();
        assert_eq!(ws.cache.hash, HashAlgo::Blake3);
        assert_eq!(ws.concurrency.default, ConcurrencyDefault::Auto);
        assert!(ws.concurrency.tags.is_empty());
        assert_eq!(ws.output.mode, OutputMode::Live);
        assert_eq!(
            ws.execution.cancel_grace.as_duration(),
            Duration::from_secs(5)
        );
    }
}