Skip to main content

bijux_cli/kernel/
policy.rs

1#![forbid(unsafe_code)]
2//! Kernel policy resolution utilities.
3
4use crate::contracts::{
5    ColorMode, ExecutionPolicy, GlobalFlags, LogLevel, OutputFormat, PrettyMode,
6};
7
8use super::pipeline::ExecutionIntent;
9
10/// Layered policy inputs from env/config/defaults.
11#[derive(Debug, Clone, PartialEq, Eq)]
12pub struct PolicyInputs {
13    /// Environment-provided policy values.
14    pub env: GlobalFlags,
15    /// Config-provided policy values.
16    pub config: GlobalFlags,
17    /// Hard defaults.
18    pub defaults: GlobalFlags,
19}
20
21fn choose_opt<T: Copy>(a: Option<T>, b: Option<T>, c: Option<T>) -> Option<T> {
22    a.or(b).or(c)
23}
24
25/// Resolve effective policy using flags -> env -> config -> defaults precedence.
26#[must_use]
27pub fn resolve_policy(intent: &ExecutionIntent, inputs: &PolicyInputs) -> ExecutionPolicy {
28    let output_format = choose_opt(
29        intent.global_flags.output_format,
30        inputs.env.output_format,
31        choose_opt(inputs.config.output_format, inputs.defaults.output_format, None),
32    )
33    .unwrap_or(OutputFormat::Json);
34
35    let pretty_mode = choose_opt(
36        intent.global_flags.pretty_mode,
37        inputs.env.pretty_mode,
38        choose_opt(inputs.config.pretty_mode, inputs.defaults.pretty_mode, None),
39    )
40    .unwrap_or(PrettyMode::Pretty);
41
42    let color_mode = choose_opt(
43        intent.global_flags.color_mode,
44        inputs.env.color_mode,
45        choose_opt(inputs.config.color_mode, inputs.defaults.color_mode, None),
46    )
47    .unwrap_or(ColorMode::Auto);
48
49    let mut log_level = choose_opt(
50        intent.global_flags.log_level,
51        inputs.env.log_level,
52        choose_opt(inputs.config.log_level, inputs.defaults.log_level, None),
53    )
54    .unwrap_or(LogLevel::Info);
55
56    let quiet = intent.global_flags.quiet || inputs.env.quiet || inputs.config.quiet;
57    if quiet {
58        log_level = LogLevel::Error;
59    }
60
61    ExecutionPolicy {
62        output_format,
63        pretty_mode,
64        color_mode,
65        log_level,
66        quiet,
67        include_runtime: intent.global_flags.include_runtime || inputs.env.include_runtime,
68    }
69}