use config::Config;
use crate::common::session::SessionContext;
#[derive(Debug)]
pub struct AppContext<'a> {
pub site_name: Option<&'a str>,
pub manta_server_url: &'a str,
pub settings_group_name_opt: Option<&'a str>,
pub request_timeout_secs: Option<u64>,
pub power_poll_interval_secs: Option<u64>,
pub power_max_poll_attempts: Option<u32>,
pub sat_file_poll_interval_secs: Option<u64>,
pub sat_file_poll_budget_secs: Option<u64>,
pub sat_file_not_visible_budget_secs: Option<u64>,
pub read_only: bool,
pub settings: &'a Config,
pub token: Option<String>,
pub session: Option<SessionContext>,
}
impl<'a> AppContext<'a> {
pub fn require_site(&self) -> anyhow::Result<&'a str> {
self.site_name.ok_or_else(|| {
anyhow::anyhow!(
"No site selected. Pass --site <name> or set `site` in cli.toml"
)
})
}
}
#[cfg(test)]
mod tests {
use super::*;
fn ctx_with_site(site: Option<&'static str>) -> AppContext<'static> {
let settings: &'static Config = Box::leak(Box::new(Config::default()));
AppContext {
site_name: site,
manta_server_url: "https://example:8443",
settings_group_name_opt: None,
request_timeout_secs: None,
power_poll_interval_secs: None,
power_max_poll_attempts: None,
sat_file_poll_interval_secs: None,
sat_file_poll_budget_secs: None,
sat_file_not_visible_budget_secs: None,
read_only: false,
settings,
token: None,
session: None,
}
}
#[test]
fn require_site_returns_the_name_when_set() {
let ctx = ctx_with_site(Some("alps"));
assert_eq!(ctx.require_site().unwrap(), "alps");
}
#[test]
fn require_site_errors_when_unset() {
let ctx = ctx_with_site(None);
let err = ctx.require_site().unwrap_err().to_string();
assert!(err.contains("No site selected"), "got: {err}");
}
}