Skip to main content

bijux_cli/contracts/
execution.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4/// Stable output format contract.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
6#[serde(rename_all = "lowercase")]
7#[non_exhaustive]
8pub enum OutputFormat {
9    /// JSON output.
10    Json,
11    /// JSON Lines output.
12    Jsonl,
13    /// YAML output.
14    Yaml,
15    /// Human-readable text output.
16    Text,
17}
18
19/// Stable pretty-print policy.
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
21#[serde(rename_all = "kebab-case")]
22#[non_exhaustive]
23pub enum PrettyMode {
24    /// Pretty output enabled.
25    Pretty,
26    /// Compact output enabled.
27    Compact,
28}
29
30/// Stable color policy.
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
32#[serde(rename_all = "lowercase")]
33#[non_exhaustive]
34pub enum ColorMode {
35    /// Use terminal auto detection.
36    Auto,
37    /// Always emit ANSI colors.
38    Always,
39    /// Never emit ANSI colors.
40    Never,
41}
42
43/// Stable logging level contract.
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
45#[serde(rename_all = "lowercase")]
46#[non_exhaustive]
47pub enum LogLevel {
48    /// Trace-level diagnostics.
49    Trace,
50    /// Debug diagnostics.
51    Debug,
52    /// Informational logs.
53    Info,
54    /// Warning logs.
55    Warning,
56    /// Error logs.
57    Error,
58    /// Critical logs.
59    Critical,
60}
61
62/// Stable exit-code contract for automation.
63#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
64#[non_exhaustive]
65pub enum ExitCode {
66    /// Successful execution.
67    Success = 0,
68    /// Internal failure.
69    Error = 1,
70    /// Usage or validation failure.
71    Usage = 2,
72    /// Encoding or serialization failure.
73    Encoding = 3,
74    /// User interrupt signal.
75    Aborted = 130,
76}
77
78/// Stable config value source used for precedence diagnostics.
79#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
80#[serde(rename_all = "lowercase")]
81#[non_exhaustive]
82pub enum ConfigSource {
83    /// Value came from command-line flags.
84    Flags,
85    /// Value came from environment variables.
86    Env,
87    /// Value came from config file.
88    Config,
89    /// Value came from built-in defaults.
90    Defaults,
91}
92
93/// Parsed global flags before precedence resolution.
94#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
95pub struct GlobalFlags {
96    /// Optional output format override.
97    pub output_format: Option<OutputFormat>,
98    /// Optional pretty mode override.
99    pub pretty_mode: Option<PrettyMode>,
100    /// Optional color mode override.
101    pub color_mode: Option<ColorMode>,
102    /// Optional log-level override.
103    pub log_level: Option<LogLevel>,
104    /// Quiet mode.
105    pub quiet: bool,
106    /// Include runtime diagnostics.
107    pub include_runtime: bool,
108}
109
110impl GlobalFlags {
111    /// Build a default-empty global flag set.
112    #[must_use]
113    pub fn empty() -> Self {
114        Self {
115            output_format: None,
116            pretty_mode: None,
117            color_mode: None,
118            log_level: None,
119            quiet: false,
120            include_runtime: false,
121        }
122    }
123}
124
125/// Effective execution policy after precedence resolution.
126#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
127pub struct ExecutionPolicy {
128    /// Effective output format.
129    pub output_format: OutputFormat,
130    /// Effective pretty mode.
131    pub pretty_mode: PrettyMode,
132    /// Effective color mode.
133    pub color_mode: ColorMode,
134    /// Effective log level.
135    pub log_level: LogLevel,
136    /// Effective quiet mode.
137    pub quiet: bool,
138    /// Effective runtime metadata mode.
139    pub include_runtime: bool,
140}
141
142impl ExecutionPolicy {
143    /// Build the baseline execution policy.
144    #[must_use]
145    pub fn baseline() -> Self {
146        Self {
147            output_format: OutputFormat::Json,
148            pretty_mode: PrettyMode::Pretty,
149            color_mode: ColorMode::Auto,
150            log_level: LogLevel::Info,
151            quiet: false,
152            include_runtime: false,
153        }
154    }
155}