zino-cli 0.7.0

CLI tools for zino.
Documentation
use serde::Deserialize;
use std::path::PathBuf;

#[derive(Debug, Deserialize, Clone)]
pub(crate) struct ZinoToml {
    #[serde(rename = "zli-config", default)]
    pub(crate) zli_config: ZliConfig,
    #[serde(default)]
    pub(crate) remote: Remote,
    #[serde(default)]
    pub(crate) acme: Acme,
}

impl Default for ZinoToml {
    fn default() -> Self {
        let toml_str = match std::fs::read_to_string("./zino.toml") {
            Ok(toml_str) => toml_str,
            Err(err) => {
                log::warn!("Failed to read config file: {}, using default config", err);
                "".to_string()
            }
        };
        toml::from_str(&toml_str).unwrap_or_else(|e| {
            log::error!("Failed to parse config file: {}, using default config", e);
            Self::default()
        })
    }
}

#[derive(Debug, Deserialize, Clone)]
pub(crate) struct ZliConfig {
    #[serde(
        rename = "refresh-interval",
        with = "humantime_serde",
        default = "default_refresh_interval"
    )]
    pub(crate) refresh_interval: std::time::Duration,
}

fn default_refresh_interval() -> std::time::Duration {
    std::time::Duration::from_secs(60)
}

impl Default for ZliConfig {
    fn default() -> Self {
        Self {
            refresh_interval: std::time::Duration::from_secs(60),
        }
    }
}

#[derive(Debug, Deserialize, Default, Clone)]
pub(crate) struct Remote {
    #[serde(default = "default_remote_name")]
    pub(crate) name: String,
    #[serde(default = "default_remote_branch")]
    pub(crate) branch: String,
}

fn default_remote_name() -> String {
    "origin".to_string()
}

fn default_remote_branch() -> String {
    "main".to_string()
}

#[derive(Debug, Deserialize, Default, Clone)]
pub(crate) struct Acme {
    pub(crate) domain: Vec<String>,
    pub(crate) email: Vec<String>,
    #[serde(default = "default_cache_path")]
    pub(crate) cache: PathBuf,
    #[serde(default = "default_product_mode", rename = "product-mode")]
    pub(crate) product_mode: bool,
    #[serde(default = "default_listening_at", rename = "listening-at")]
    pub(crate) listening_at: u16,
    #[serde(default = "default_forward_to", rename = "forward-to")]
    pub(crate) forward_to: u16,
}
fn default_cache_path() -> PathBuf {
    PathBuf::from("default/cache/path")
}

fn default_product_mode() -> bool {
    false
}

fn default_listening_at() -> u16 {
    443
}
fn default_forward_to() -> u16 {
    6080
}