eazygit 0.5.1

A fast TUI for Git with staging, conflicts, rebase, and palette-first UX
Documentation
use super::theme::ThemeConfig;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone)]
pub struct Settings {
    pub core: CoreConfig,
    pub diff: DiffConfig,
    pub ui: UiConfig,
    pub theme: ThemeConfig,
    pub keymap: std::collections::HashMap<String, String>,
    pub custom_commands: std::collections::HashMap<String, String>,
    pub commit_template: Option<String>,
    // Repo path is runtime state, mostly, but kept here for convenience
    pub repo_path: String,
}

#[derive(Debug, Clone)]
pub struct CoreConfig {
    pub editor: Option<String>,
    pub auto_fetch: bool,
    pub auto_fetch_interval: u64,
    pub auto_fetch_remote: String,
    pub format_command: Option<String>,
    pub format_on_revert: bool,
    pub push_ff_only_enforce: bool,
    pub pull_ff_only: bool,
    pub pull_autostash: bool,
    pub pull_timeout_secs: u64,
    pub rebase_timeout_secs: u64,
}

#[derive(Debug, Clone)]
pub struct DiffConfig {
    pub context_lines: u32,
    pub syntax_highlight: bool,
}

#[derive(Debug, Clone)]
pub struct UiConfig {
    pub theme: String,
    pub show_help_footer: bool,
    pub font_family: Option<String>,
    pub font_size: Option<u16>,
    pub background_image_path: Option<String>,
    pub background_opacity: f32,
    pub terminal_transparency: bool,
}

impl Default for Settings {
    fn default() -> Self {
        Self {
            core: CoreConfig::default(),
            diff: DiffConfig::default(),
            ui: UiConfig::default(),
            theme: ThemeConfig::default(),
            keymap: std::collections::HashMap::default(),
            custom_commands: std::collections::HashMap::default(),
            commit_template: None,
            repo_path: ".".to_string(),
        }
    }
}

impl Default for CoreConfig {
    fn default() -> Self {
        Self {
            editor: None,
            auto_fetch: true,
            auto_fetch_interval: 60,
            auto_fetch_remote: "origin".to_string(),
            format_command: None,
            format_on_revert: false,
            push_ff_only_enforce: false,
            pull_ff_only: false,
            pull_autostash: true,
            pull_timeout_secs: 30,
            rebase_timeout_secs: 30,
        }
    }
}

impl Default for DiffConfig {
    fn default() -> Self {
        Self {
            context_lines: 3,
            syntax_highlight: true,
        }
    }
}

impl Default for UiConfig {
    fn default() -> Self {
        Self {
            theme: "default_dark".to_string(),
            show_help_footer: true,
            font_family: None,
            font_size: None,
            background_image_path: None,
            background_opacity: 0.3,
            terminal_transparency: true,
        }
    }
}

// Partial structs for deserialization
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct PartialCoreConfig {
    pub editor: Option<String>,
    pub auto_fetch: Option<bool>,
    pub auto_fetch_interval: Option<u64>,
    pub auto_fetch_remote: Option<String>,
    pub format_command: Option<String>,
    pub format_on_revert: Option<bool>,
    pub push_ff_only_enforce: Option<bool>,
    pub pull_ff_only: Option<bool>,
    pub pull_autostash: Option<bool>,
    pub pull_timeout_secs: Option<u64>,
    pub rebase_timeout_secs: Option<u64>,
}

#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct PartialDiffConfig {
    pub context_lines: Option<u32>,
    pub syntax_highlight: Option<bool>,
}

#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct PartialUiConfig {
    pub theme: Option<String>,
    pub show_help_footer: Option<bool>,
    pub font_family: Option<String>,
    pub font_size: Option<u16>,
    pub background_image_path: Option<String>,
    pub background_opacity: Option<f32>,
    pub terminal_transparency: Option<bool>,
}