disktui 1.3.0

A terminal-based disk management utility built with Rust and Ratatui
Documentation
use serde::Deserialize;

#[derive(Deserialize, Debug, Default)]
pub struct Config {
    #[serde(default)]
    pub navigation: Navigation,

    #[serde(default)]
    pub disk: DiskKeys,
}

#[derive(Deserialize, Debug)]
pub struct Navigation {
    #[serde(default = "default_scroll_down")]
    pub scroll_down: char,

    #[serde(default = "default_scroll_up")]
    pub scroll_up: char,
}

impl Default for Navigation {
    fn default() -> Self {
        Self {
            scroll_down: 'j',
            scroll_up: 'k',
        }
    }
}

fn default_scroll_down() -> char {
    'j'
}

fn default_scroll_up() -> char {
    'k'
}

#[derive(Deserialize, Debug)]
pub struct DiskKeys {
    #[serde(default = "default_info")]
    pub info: char,

    #[serde(default = "default_format")]
    pub format: char,

    #[serde(default = "default_partition")]
    pub partition: char,

    #[serde(default = "default_mount")]
    pub mount: char,

    #[serde(default = "default_delete")]
    pub delete: char,

    #[serde(default = "default_resize")]
    pub resize: char,

    #[serde(default = "default_lock")]
    pub lock: char,

    #[serde(default = "default_encrypt")]
    pub encrypt: char,
}

impl Default for DiskKeys {
    fn default() -> Self {
        Self {
            info: 'i',
            format: 'f',
            partition: 'p',
            mount: 'm',
            delete: 'd',
            resize: 'r',
            lock: 'l',
            encrypt: 'e',
        }
    }
}

fn default_info() -> char {
    'i'
}

fn default_format() -> char {
    'f'
}

fn default_partition() -> char {
    'p'
}

fn default_mount() -> char {
    'm'
}

fn default_delete() -> char {
    'd'
}

fn default_resize() -> char {
    'r'
}

fn default_lock() -> char {
    'l'
}

fn default_encrypt() -> char {
    'e'
}

impl Config {
    pub fn new() -> Self {
        let conf_path = dirs::config_dir()
            .unwrap_or_else(|| std::path::PathBuf::from("."))
            .join("disktui")
            .join("config.toml");

        match std::fs::read_to_string(&conf_path) {
            Ok(config_str) => {
                toml::from_str(&config_str).unwrap_or_else(|e| {
                    eprintln!("Warning: Failed to parse config file {:?}: {}", conf_path, e);
                    eprintln!("Using default configuration.");
                    Config::default()
                })
            }
            Err(_) => Config::default(),
        }
    }
}