script 0.5.0

barebones http scripting
use crate::{helpers::prelude::*, structs::config::*};

use colored::Colorize;
use pickledb::SerializationMethod;
use std::fs;

use macros_rs::{
    fmt::{crashln, string},
    fs::file_exists,
};

pub fn read() -> Config {
    let config_path = format!("config.toml");

    if !file_exists!(&config_path) {
        let config = Config {
            env: None,
            database: None,
            workers: vec!["app.routes".into()],
            settings: Settings {
                cache: string!(".script"),
                address: string!("127.0.0.1"),
                port: 3500,
            },
        };

        let contents = match toml::to_string(&config) {
            Ok(contents) => contents,
            Err(err) => crashln!("Cannot parse config.\n{}", string!(err).white()),
        };

        if let Err(err) = fs::write(&config_path, contents) {
            crashln!("Error writing config.\n{}", string!(err).white())
        }
        tracing::info!(path = config_path, created = true, "config");
    }

    read_toml(config_path)
}

impl Config {
    pub fn get_address(&self) -> (String, u16) { (self.settings.address.clone(), self.settings.port.clone()) }

    pub fn kv_serialization_method(&self) -> Option<SerializationMethod> {
        let database = self.database.clone()?.kv?;

        match &*database.method {
            "json" | "default" => Some(SerializationMethod::Json),
            "yaml" | "yml" => Some(SerializationMethod::Yaml),
            "binary" | "bin" => Some(SerializationMethod::Bin),
            _ => Some(SerializationMethod::Bin),
        }
    }
}