use cfg_if::cfg_if;
use wasm_bindgen::prelude::*;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("Environment variable is not set: {1}")]
EnvVar(std::env::VarError, String),
}
#[derive(Clone, Debug)]
#[wasm_bindgen(getter_with_clone)]
pub struct ClientConfig {
pub app_id: String,
pub cluster: String,
pub cache_dir: Option<String>,
#[allow(clippy::doc_markdown)]
pub config_server: String,
pub secret: Option<String>,
pub label: Option<String>,
pub ip: Option<String>,
pub allow_insecure_https: Option<bool>,
#[cfg(not(target_arch = "wasm32"))]
pub cache_ttl: Option<u64>,
#[cfg(not(target_arch = "wasm32"))]
pub refresh_interval: Option<u64>,
#[cfg(not(target_arch = "wasm32"))]
#[wasm_bindgen(skip)]
pub http_client: Option<reqwest::Client>,
}
impl From<Error> for JsValue {
fn from(error: Error) -> Self {
JsValue::from_str(&error.to_string())
}
}
cfg_if! {
if #[cfg(not(target_arch = "wasm32"))] {
impl ClientConfig {
pub fn from_env() -> Result<Self, Error> {
let app_id =
std::env::var("APP_ID").map_err(|e| Error::EnvVar(e, "APP_ID".to_string()))?;
let secret = std::env::var("APOLLO_ACCESS_KEY_SECRET")
.map_err(|e| Error::EnvVar(e, "APOLLO_ACCESS_KEY_SECRET".to_string()))
.ok();
let cluster = std::env::var("IDC").unwrap_or("default".to_string());
let config_server = std::env::var("APOLLO_CONFIG_SERVICE")
.map_err(|e| Error::EnvVar(e, "APOLLO_CONFIG_SERVICE".to_string()))?;
let label = std::env::var("APOLLO_LABEL")
.map_err(|e| Error::EnvVar(e, "APOLLO_LABEL".to_string()))
.ok();
let cache_dir = std::env::var("APOLLO_CACHE_DIR").ok();
let allow_insecure_https = std::env::var("APOLLO_ALLOW_INSECURE_HTTPS")
.ok()
.and_then(|s| s.parse().ok());
let cache_ttl = std::env::var("APOLLO_CACHE_TTL")
.ok()
.and_then(|s| s.parse().ok())
.or(Some(600));
let refresh_interval = std::env::var("APOLLO_REFRESH_INTERVAL")
.ok()
.and_then(|s| s.parse().ok())
.map(|v| {
let min_val = if cfg!(test) { 1 } else { 30 };
if v < min_val { min_val } else { v }
})
.or(Some(30));
Ok(Self {
app_id,
secret,
cluster,
config_server,
cache_dir,
label,
ip: None,
allow_insecure_https,
cache_ttl,
refresh_interval,
http_client: None,
})
}
}
} else {
#[wasm_bindgen]
impl ClientConfig {
pub fn from_env() -> Result<Self, Error> {
let app_id =
std::env::var("APP_ID").map_err(|e| Error::EnvVar(e, "APP_ID".to_string()))?;
let secret = std::env::var("APOLLO_ACCESS_KEY_SECRET")
.map_err(|e| Error::EnvVar(e, "APOLLO_ACCESS_KEY_SECRET".to_string()))
.ok();
let cluster = std::env::var("IDC").unwrap_or("default".to_string());
let config_server = std::env::var("APOLLO_CONFIG_SERVICE")
.map_err(|e| Error::EnvVar(e, "APOLLO_CONFIG_SERVICE".to_string()))?;
let label = std::env::var("APOLLO_LABEL")
.map_err(|e| Error::EnvVar(e, "APOLLO_LABEL".to_string()))
.ok();
let cache_dir = std::env::var("APOLLO_CACHE_DIR").ok();
let allow_insecure_https = std::env::var("APOLLO_ALLOW_INSECURE_HTTPS")
.ok()
.and_then(|s| s.parse().ok());
Ok(Self {
app_id,
secret,
cluster,
config_server,
cache_dir,
label,
ip: None,
allow_insecure_https,
})
}
}
}
}
cfg_if! {
if #[cfg(not(target_arch = "wasm32"))] {
impl ClientConfig {
pub(crate) fn get_cache_dir(&self) -> std::path::PathBuf {
let base = std::path::PathBuf::from(
&self
.cache_dir
.clone()
.unwrap_or_else(|| String::from("/opt/data")),
);
base.join(&self.app_id).join("config-cache")
}
}
} else {
#[wasm_bindgen]
impl ClientConfig {
#[wasm_bindgen(constructor)]
pub fn new(app_id: String, config_server: String, cluster: String) -> Self {
Self {
app_id,
config_server,
cluster,
cache_dir: None,
secret: None,
label: None,
ip: None,
allow_insecure_https: None,
}
}
}
}
}