1use std::env;
4use std::path::PathBuf;
5
6use serde::{Deserialize, Serialize};
7
8pub const DEFAULT_BASE_URL: &str = "https://fizzy.do";
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(default)]
14#[non_exhaustive]
15pub struct Config {
16 pub base_url: String,
18 pub account: Option<String>,
20 pub cache_dir: PathBuf,
22 pub cache_enabled: bool,
24}
25
26impl Default for Config {
27 fn default() -> Config {
28 Config {
29 base_url: DEFAULT_BASE_URL.to_string(),
30 account: None,
31 cache_dir: default_cache_dir(),
32 cache_enabled: false,
33 }
34 }
35}
36
37impl Config {
38 pub fn new() -> Config {
40 Config::default()
41 }
42
43 pub fn with_env(mut self) -> Config {
47 if let Some(value) = env_value("FIZZY_API_URL") {
48 self.base_url = value;
49 }
50 if let Some(value) = env_value("FIZZY_ACCOUNT") {
51 self.account = Some(value);
52 }
53 if let Some(value) = env_value("FIZZY_CACHE_DIR") {
54 self.cache_dir = PathBuf::from(value);
55 }
56 if let Some(value) = env_value("FIZZY_CACHE_ENABLED") {
57 self.cache_enabled = value.eq_ignore_ascii_case("true") || value == "1";
58 }
59 self
60 }
61
62 pub fn with_base_url(mut self, base_url: impl Into<String>) -> Config {
64 self.base_url = base_url.into();
65 self
66 }
67
68 pub fn with_account(mut self, account: impl Into<String>) -> Config {
70 self.account = Some(account.into());
71 self
72 }
73
74 pub fn with_cache_enabled(mut self, enabled: bool) -> Config {
76 self.cache_enabled = enabled;
77 self
78 }
79
80 pub fn with_cache_dir(mut self, cache_dir: impl Into<PathBuf>) -> Config {
82 self.cache_dir = cache_dir.into();
83 self
84 }
85
86 pub fn origin(&self) -> &str {
88 self.base_url.trim_end_matches('/')
89 }
90}
91
92fn env_value(name: &str) -> Option<String> {
93 env::var(name).ok().filter(|value| !value.is_empty())
94}
95
96pub fn default_cache_dir() -> PathBuf {
99 xdg_dir("XDG_CACHE_HOME", ".cache").join("fizzy")
100}
101
102pub fn default_config_dir() -> PathBuf {
105 xdg_dir("XDG_CONFIG_HOME", ".config").join("fizzy")
106}
107
108fn xdg_dir(variable: &str, fallback: &str) -> PathBuf {
109 match env_value(variable) {
110 Some(value) => PathBuf::from(value),
111 None => env::home_dir()
112 .unwrap_or_else(|| PathBuf::from("."))
113 .join(fallback),
114 }
115}