use std::sync::OnceLock;
use std::time::Duration;
pub(crate) mod approvals;
pub(crate) mod fleet;
pub(crate) mod portforward;
pub(crate) mod questions;
pub(crate) mod tools;
pub(crate) mod transcript;
const CONNECT_TIMEOUT: Duration = Duration::from_secs(5);
#[must_use]
pub(crate) fn http_client() -> &'static reqwest::Client {
static CLIENT: OnceLock<reqwest::Client> = OnceLock::new();
CLIENT.get_or_init(|| {
reqwest::Client::builder()
.timeout(Duration::from_secs(5))
.connect_timeout(CONNECT_TIMEOUT)
.build()
.unwrap_or_default()
})
}
pub(crate) const DEFAULT_NAMESPACE: &str = "polychrome";
#[derive(Debug, Clone)]
pub(crate) struct DataConfig {
pub namespace: String,
pub agent_addr: Option<String>,
pub forensics_base_url: Option<String>,
}
impl DataConfig {
#[must_use]
pub(crate) fn from_env() -> Self {
let namespace = std::env::var("PC_TUI_NAMESPACE")
.ok()
.filter(|s| !s.is_empty())
.or_else(|| {
std::env::var("POLYCHROME_NAMESPACE")
.ok()
.filter(|s| !s.is_empty())
})
.unwrap_or_else(|| DEFAULT_NAMESPACE.to_owned());
let agent_addr = std::env::var("PC_TUI_AGENT_ADDR")
.ok()
.filter(|s| !s.trim().is_empty());
let forensics_base_url = std::env::var("PC_TUI_FORENSICS_URL")
.ok()
.filter(|s| !s.trim().is_empty());
Self {
namespace,
agent_addr,
forensics_base_url,
}
}
#[must_use]
pub(crate) fn resolve(
namespace: Option<String>,
agent_addr: Option<String>,
forensics_base_url: Option<String>,
) -> Self {
let mut cfg = Self::from_env();
if let Some(ns) = namespace.filter(|s| !s.is_empty()) {
cfg.namespace = ns;
}
if let Some(addr) = agent_addr.filter(|s| !s.trim().is_empty()) {
cfg.agent_addr = Some(addr);
}
if let Some(url) = forensics_base_url.filter(|s| !s.trim().is_empty()) {
cfg.forensics_base_url = Some(url);
}
cfg
}
}