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)
"
)
}