use crate::{DaemonAsync, DaemonBuilder};
use std::rc::Rc;
use ibc_chain_registry::chain::ChainData;
use super::{error::DaemonError, sender::Sender, state::DaemonState};
pub const DEFAULT_DEPLOYMENT: &str = "default";
#[derive(Clone, Default)]
pub struct DaemonAsyncBuilder {
pub(crate) chain: Option<ChainData>,
pub(crate) deployment_id: Option<String>,
pub(crate) mnemonic: Option<String>,
}
impl DaemonAsyncBuilder {
pub fn chain(&mut self, chain: impl Into<ChainData>) -> &mut Self {
self.chain = Some(chain.into());
self
}
pub fn deployment_id(&mut self, deployment_id: impl Into<String>) -> &mut Self {
self.deployment_id = Some(deployment_id.into());
self
}
pub fn mnemonic(&mut self, mnemonic: impl ToString) -> &mut Self {
self.mnemonic = Some(mnemonic.to_string());
self
}
pub async fn build(&self) -> Result<DaemonAsync, DaemonError> {
let chain = self
.chain
.clone()
.ok_or(DaemonError::BuilderMissing("chain information".into()))?;
let deployment_id = self
.deployment_id
.clone()
.unwrap_or(DEFAULT_DEPLOYMENT.to_string());
let state = Rc::new(DaemonState::new(chain, deployment_id).await?);
let sender = if let Some(mnemonic) = &self.mnemonic {
Sender::from_mnemonic(&state, mnemonic)?
} else {
Sender::new(&state)?
};
let daemon = DaemonAsync {
state,
sender: Rc::new(sender),
};
Ok(daemon)
}
}
impl From<DaemonBuilder> for DaemonAsyncBuilder {
fn from(value: DaemonBuilder) -> Self {
DaemonAsyncBuilder {
chain: value.chain,
deployment_id: value.deployment_id,
mnemonic: value.mnemonic,
}
}
}