use std::time::Duration;
use crate::Error;
pub const ENV_URL: &str = "HEADWATERS_URL";
pub const ENV_TOKEN: &str = "HEADWATERS_TOKEN";
pub const ENV_TIMEOUT_MS: &str = "HEADWATERS_TIMEOUT_MS";
pub const ENV_AUTH: &str = "HEADWATERS_AUTH";
pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30);
#[derive(Debug, Clone)]
pub struct HeadwatersConfig {
pub(crate) base_url: String,
pub(crate) token: Option<String>,
pub(crate) timeout: Duration,
}
impl HeadwatersConfig {
pub fn new(base_url: impl Into<String>) -> Self {
Self {
base_url: base_url.into(),
token: None,
timeout: DEFAULT_TIMEOUT,
}
}
pub fn from_env() -> Result<Self, Error> {
let base_url = std::env::var(ENV_URL).map_err(|_| Error::MissingEnvVar(ENV_URL))?;
let mut config = Self::new(base_url);
if let Ok(token) = std::env::var(ENV_TOKEN) {
config.token = Some(token);
}
if let Some(ms) = std::env::var(ENV_TIMEOUT_MS)
.ok()
.and_then(|v| v.parse().ok())
{
config.timeout = Duration::from_millis(ms);
}
Ok(config)
}
#[must_use]
pub fn with_token(mut self, token: impl Into<String>) -> Self {
self.token = Some(token.into());
self
}
#[must_use]
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
}