use std::path::PathBuf;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, NoneAsEmptyString};
use crate::{
config::{
DEFAULT_LATTICE_PREFIX, DEFAULT_NATS_HOST, DEFAULT_NATS_PORT, DEFAULT_NATS_TIMEOUT_MS,
},
id::ClusterSeed,
};
pub mod fs;
pub const HOST_CONFIG_NAME: &str = "host_config";
pub trait ContextManager {
fn default_context(&self) -> Result<Option<String>>;
fn set_default_context(&self, name: &str) -> Result<()>;
fn save_context(&self, ctx: &WashContext) -> Result<()>;
fn delete_context(&self, name: &str) -> Result<()>;
fn load_default_context(&self) -> Result<WashContext>;
fn load_context(&self, name: &str) -> Result<WashContext>;
fn list_contexts(&self) -> Result<Vec<String>>;
}
#[derive(Clone, Deserialize, Serialize, Debug)]
pub(crate) struct DefaultContext<'a> {
pub name: &'a str,
}
#[serde_as]
#[derive(Clone, Deserialize, Serialize, Debug)]
pub struct WashContext {
#[serde(default)]
pub name: String,
#[serde_as(as = "NoneAsEmptyString")]
pub cluster_seed: Option<ClusterSeed>,
#[serde(default = "default_nats_host")]
pub ctl_host: String,
#[serde(default = "default_nats_port")]
pub ctl_port: u16,
#[serde_as(as = "NoneAsEmptyString")]
pub ctl_jwt: Option<String>,
#[serde_as(as = "NoneAsEmptyString")]
pub ctl_seed: Option<String>,
pub ctl_credsfile: Option<PathBuf>,
#[serde(default = "default_timeout_ms")]
pub ctl_timeout: u64,
#[serde(default = "default_lattice_prefix")]
pub lattice_prefix: String,
pub js_domain: Option<String>,
#[serde(default = "default_nats_host")]
pub rpc_host: String,
#[serde(default = "default_nats_port")]
pub rpc_port: u16,
#[serde_as(as = "NoneAsEmptyString")]
pub rpc_jwt: Option<String>,
#[serde_as(as = "NoneAsEmptyString")]
pub rpc_seed: Option<String>,
pub rpc_credsfile: Option<PathBuf>,
#[serde(default = "default_timeout_ms")]
pub rpc_timeout: u64,
}
impl WashContext {
pub fn named(name: String) -> Self {
WashContext {
name,
..Self::default()
}
}
}
impl Default for WashContext {
fn default() -> Self {
WashContext {
name: "default".to_string(),
cluster_seed: None,
ctl_host: DEFAULT_NATS_HOST.to_string(),
ctl_port: DEFAULT_NATS_PORT.parse().unwrap(),
ctl_jwt: None,
ctl_seed: None,
ctl_credsfile: None,
ctl_timeout: DEFAULT_NATS_TIMEOUT_MS,
lattice_prefix: DEFAULT_LATTICE_PREFIX.to_string(),
js_domain: None,
rpc_host: DEFAULT_NATS_HOST.to_string(),
rpc_port: DEFAULT_NATS_PORT.parse().unwrap(),
rpc_jwt: None,
rpc_seed: None,
rpc_credsfile: None,
rpc_timeout: DEFAULT_NATS_TIMEOUT_MS,
}
}
}
fn default_nats_host() -> String {
DEFAULT_NATS_HOST.to_string()
}
fn default_nats_port() -> u16 {
DEFAULT_NATS_PORT.parse().unwrap()
}
fn default_lattice_prefix() -> String {
DEFAULT_LATTICE_PREFIX.to_string()
}
fn default_timeout_ms() -> u64 {
DEFAULT_NATS_TIMEOUT_MS
}