use std::path::PathBuf;
use degenbot_config::{
resolve_chain_id, resolve_database_path, resolve_node_http_uri, resolve_node_uris, EnvVars,
Resolved, ResolvedNodeUris,
};
pub struct CliContext<'a> {
env: &'a dyn EnvVars,
database: Option<String>,
chain_id: Option<String>,
node_http: Option<String>,
node_ws: Option<String>,
}
impl<'a> CliContext<'a> {
#[must_use]
pub fn new(env: &'a dyn EnvVars) -> Self {
Self {
env,
database: None,
chain_id: None,
node_http: None,
node_ws: None,
}
}
#[must_use]
pub fn with_database(mut self, database: impl Into<String>) -> Self {
self.database = Some(database.into());
self
}
#[must_use]
pub fn with_chain_id(mut self, chain_id: impl Into<String>) -> Self {
self.chain_id = Some(chain_id.into());
self
}
#[must_use]
pub fn with_node_http(mut self, uri: impl Into<String>) -> Self {
self.node_http = Some(uri.into());
self
}
#[must_use]
pub fn with_node_ws(mut self, uri: impl Into<String>) -> Self {
self.node_ws = Some(uri.into());
self
}
#[must_use]
pub fn env(&self) -> &'a dyn EnvVars {
self.env
}
#[must_use]
pub fn database_override(&self) -> Option<&str> {
self.database.as_deref()
}
#[must_use]
pub fn database_path(&self) -> Resolved<PathBuf> {
resolve_database_path(self.env, self.database.as_deref())
}
pub fn chain_id(&self) -> Result<Resolved<u64>, degenbot_config::ConfigError> {
resolve_chain_id(self.env, self.chain_id.as_deref())
}
pub fn node_http_uri_for(
&self,
chain_id: u64,
) -> Result<Resolved<String>, degenbot_config::ConfigError> {
resolve_node_http_uri(self.env, chain_id, self.node_http.as_deref())
}
pub fn node_http_uri(&self) -> Result<Resolved<String>, degenbot_config::ConfigError> {
let chain_id = self.chain_id()?;
self.node_http_uri_for(chain_id.value)
}
pub fn node_uris(&self) -> Result<ResolvedNodeUris, degenbot_config::ConfigError> {
let chain_id = self.chain_id()?;
resolve_node_uris(
self.env,
chain_id.value,
self.node_http.as_deref(),
self.node_ws.as_deref(),
)
}
}