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