bijux_cli/kernel/
policy.rs1#![forbid(unsafe_code)]
2use crate::contracts::{
5 ColorMode, ExecutionPolicy, GlobalFlags, LogLevel, OutputFormat, PrettyMode,
6};
7
8use super::pipeline::ExecutionIntent;
9
10#[derive(Debug, Clone, PartialEq, Eq)]
12pub struct PolicyInputs {
13 pub env: GlobalFlags,
15 pub config: GlobalFlags,
17 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#[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}