Skip to content
pub struct Server {
    address: (String, u16),
    log_level: String,
    db_path: String,
    admin_api_key: String,
}

impl Server {
    pub fn new(address: (String, u16), log_level: String, db_path: String, admin_api_key: String) -> Self {
        Server {
            address,
            log_level,
            db_path,
            admin_api_key,
        }
    }

    pub fn address(&self) -> (String, u16) {
        self.address.clone()
    }

    pub fn log_level(&self) -> &str {
        &self.log_level
    }

    pub fn db_path(&self) -> &str {
        &self.db_path
    }

    pub fn admin_api_key(&self) -> &str {
        &self.admin_api_key
    }
}

impl std::fmt::Display for Server {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", ascii(self))
    }
}

pub fn from_env() -> Server {
    let port = std::env::var("PORT")
        .unwrap_or_else(|_| "9090".to_string())
        .parse()
        .unwrap_or(9090);
    let log_level = std::env::var("LOG_LEVEL").unwrap_or_else(|_| "info".to_string());
    let db_path = std::env::var("DB_PATH").unwrap_or_else(|_| "corium.db".to_string());
    let admin_api_key = std::env::var("ADMIN_API_KEY")
        .unwrap_or_else(|_| "corium-admin-change-me".to_string());

    Server::new(("0.0.0.0".to_string(), port), log_level, db_path, admin_api_key)
}

impl Clone for Server {
    fn clone(&self) -> Self {
        Self {
            address: self.address.clone(),
            log_level: self.log_level.clone(),
            db_path: self.db_path.clone(),
            admin_api_key: self.admin_api_key.clone(),
        }
    }
}

fn ascii(server: &Server) -> String {
    let (_, port) = server.address();
    let url = format!("http://localhost:{port}");
    let version = env!("CARGO_PKG_VERSION");
    format!(
        "
  Server running at: {url}
  Version: {version}
  Database: SQLite (local)
        "
    )
}