use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "camelCase")]
pub struct Config {
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<OutputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub commands: Option<CommandsConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_mode: Option<CacheMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub audit_mode: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trace_output: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_environment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_capabilities: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backend: Option<BackendConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ci: Option<CIConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "camelCase")]
pub struct CommandsConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub task: Option<TaskCommandConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "camelCase")]
pub struct TaskCommandConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<TaskListConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "camelCase")]
pub struct TaskListConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<TaskListFormat>,
}
impl Config {
#[must_use]
pub fn task_list_format(&self) -> Option<TaskListFormat> {
self.commands
.as_ref()
.and_then(|c| c.task.as_ref())
.and_then(|t| t.list.as_ref())
.and_then(|l| l.format)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "camelCase")]
pub struct CIConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub cuenv: Option<CuenvConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CuenvConfig {
#[serde(default)]
pub source: CuenvSource,
#[serde(default = "default_cuenv_version")]
pub version: String,
}
fn default_cuenv_version() -> String {
"self".to_string()
}
impl Default for CuenvConfig {
fn default() -> Self {
Self {
source: CuenvSource::Release,
version: default_cuenv_version(),
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum CuenvSource {
Native,
Artifact,
Git,
Nix,
Homebrew,
#[default]
Release,
}
impl CuenvSource {
#[must_use]
pub const fn as_str(&self) -> &'static str {
match self {
Self::Native => "native",
Self::Artifact => "artifact",
Self::Git => "git",
Self::Nix => "nix",
Self::Homebrew => "homebrew",
Self::Release => "release",
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum OutputFormat {
Tui,
Spinner,
Simple,
Tree,
Json,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum TaskListFormat {
Text,
Rich,
Tables,
Dashboard,
Emoji,
}
impl TaskListFormat {
#[must_use]
pub const fn as_str(&self) -> &'static str {
match self {
Self::Text => "text",
Self::Rich => "rich",
Self::Tables => "tables",
Self::Dashboard => "dashboard",
Self::Emoji => "emoji",
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum CacheMode {
Off,
Read,
ReadWrite,
Write,
}
fn default_backend_type() -> String {
"host".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct BackendConfig {
#[serde(default = "default_backend_type", rename = "type")]
pub backend_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<BackendOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct BackendOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub platform: Option<String>,
}