use std::env;
use std::path::PathBuf;
use serde::{Deserialize, Serialize};
pub const DEFAULT_BASE_URL: &str = "https://fizzy.do";
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct Config {
pub base_url: String,
pub account: Option<String>,
pub cache_dir: PathBuf,
pub cache_enabled: bool,
}
impl Default for Config {
fn default() -> Config {
Config {
base_url: DEFAULT_BASE_URL.to_string(),
account: None,
cache_dir: default_cache_dir(),
cache_enabled: false,
}
}
}
impl Config {
pub fn new() -> Config {
Config::default()
}
pub fn with_env(mut self) -> Config {
if let Some(value) = env_value("FIZZY_API_URL") {
self.base_url = value;
}
if let Some(value) = env_value("FIZZY_ACCOUNT") {
self.account = Some(value);
}
if let Some(value) = env_value("FIZZY_CACHE_DIR") {
self.cache_dir = PathBuf::from(value);
}
if let Some(value) = env_value("FIZZY_CACHE_ENABLED") {
self.cache_enabled = value.eq_ignore_ascii_case("true") || value == "1";
}
self
}
pub fn with_base_url(mut self, base_url: impl Into<String>) -> Config {
self.base_url = base_url.into();
self
}
pub fn with_account(mut self, account: impl Into<String>) -> Config {
self.account = Some(account.into());
self
}
pub fn with_cache_enabled(mut self, enabled: bool) -> Config {
self.cache_enabled = enabled;
self
}
pub fn with_cache_dir(mut self, cache_dir: impl Into<PathBuf>) -> Config {
self.cache_dir = cache_dir.into();
self
}
pub fn origin(&self) -> &str {
self.base_url.trim_end_matches('/')
}
}
fn env_value(name: &str) -> Option<String> {
env::var(name).ok().filter(|value| !value.is_empty())
}
pub fn default_cache_dir() -> PathBuf {
xdg_dir("XDG_CACHE_HOME", ".cache").join("fizzy")
}
pub fn default_config_dir() -> PathBuf {
xdg_dir("XDG_CONFIG_HOME", ".config").join("fizzy")
}
fn xdg_dir(variable: &str, fallback: &str) -> PathBuf {
match env_value(variable) {
Some(value) => PathBuf::from(value),
None => env::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(fallback),
}
}