cuenv_core/config/
mod.rs

1//! Configuration types for cuenv
2//!
3//! Based on schema/config.cue
4
5use serde::{Deserialize, Serialize};
6
7/// Main configuration structure for cuenv
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
9#[serde(rename_all = "camelCase")]
10pub struct Config {
11    /// Task output format
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub output_format: Option<OutputFormat>,
14
15    /// Cache configuration
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub cache_mode: Option<CacheMode>,
18
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub cache_enabled: Option<bool>,
21
22    /// Security and debugging
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub audit_mode: Option<bool>,
25
26    /// Chrome trace generation
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub trace_output: Option<bool>,
29
30    /// Default environment settings
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub default_environment: Option<String>,
33
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub default_capabilities: Option<Vec<String>>,
36
37    /// Task backend configuration
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub backend: Option<BackendConfig>,
40
41    /// CI-specific configuration
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub ci: Option<CIConfig>,
44}
45
46/// CI-specific configuration
47#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
48#[serde(rename_all = "camelCase")]
49pub struct CIConfig {
50    /// Cuenv installation configuration
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub cuenv: Option<CuenvConfig>,
53}
54
55/// Configuration for cuenv installation in CI
56#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
57#[serde(rename_all = "camelCase")]
58pub struct CuenvConfig {
59    /// Source for cuenv binary
60    #[serde(default)]
61    pub source: CuenvSource,
62}
63
64impl Default for CuenvConfig {
65    fn default() -> Self {
66        Self {
67            source: CuenvSource::Release,
68        }
69    }
70}
71
72/// Source for cuenv binary in CI environments
73#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
74#[serde(rename_all = "lowercase")]
75pub enum CuenvSource {
76    /// Download from GitHub Releases (default)
77    #[default]
78    Release,
79    /// Build from source via nix build
80    Build,
81}
82
83/// Task output format options
84#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
85#[serde(rename_all = "lowercase")]
86pub enum OutputFormat {
87    Tui,
88    Spinner,
89    Simple,
90    Tree,
91    Json,
92}
93
94/// Cache mode options
95#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
96#[serde(rename_all = "kebab-case")]
97pub enum CacheMode {
98    Off,
99    Read,
100    ReadWrite,
101    Write,
102}
103
104fn default_backend_type() -> String {
105    "host".to_string()
106}
107
108/// Backend configuration
109#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
110pub struct BackendConfig {
111    /// Which backend to use for tasks
112    #[serde(default = "default_backend_type", rename = "type")]
113    pub backend_type: String,
114
115    /// Backend-specific options
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub options: Option<BackendOptions>,
118}
119
120/// Backend-specific options supported by cuenv
121#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
122pub struct BackendOptions {
123    /// Default container image for the Dagger backend
124    #[serde(skip_serializing_if = "Option::is_none")]
125    pub image: Option<String>,
126
127    /// Optional platform hint for the Dagger backend
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub platform: Option<String>,
130}