pub(crate) mod remote_account;
mod remote_application;
use std::collections::HashMap;
use cw_orch_interchain::prelude::*;
pub use remote_account::RemoteAccount;
pub use remote_application::RemoteApplication;
use crate::{client::AbstractClientResult, AbstractClient, Environment};
pub struct AbstractInterchainClient<Chain: IbcQueryHandler> {
pub clients: HashMap<String, AbstractClient<Chain>>,
}
impl<Chain: IbcQueryHandler> AbstractInterchainClient<Chain> {
pub fn new<Interchain: InterchainEnv<Chain>>(
interchain: &Interchain,
) -> AbstractClientResult<Self> {
let clients = interchain
.chains()
.map(|chain| AbstractClient::new(chain.clone()))
.collect::<Result<Vec<_>, _>>()?;
Ok(AbstractInterchainClient {
clients: clients
.into_iter()
.map(|c| (c.environment().chain_id(), c))
.collect(),
})
}
pub fn load_from<Interchain: InterchainEnv<Chain>>(
interchain: &Interchain,
) -> AbstractClientResult<Self> {
Self::new(interchain)
}
pub fn deploy_on<Interchain: InterchainEnv<Chain>>(
interchain: &Interchain,
) -> AbstractClientResult<Self> {
let clients = interchain
.chains()
.map(|chain| AbstractClient::builder(chain.clone()).build())
.collect::<Result<Vec<_>, _>>()?;
for i in 0..clients.len() {
for j in i + 1..clients.len() {
clients[i].connect_to(&clients[j], interchain)?;
}
}
Ok(AbstractInterchainClient {
clients: clients
.into_iter()
.map(|c| (c.environment().chain_id(), c))
.collect(),
})
}
pub fn client(&self, chain_id: &str) -> AbstractClientResult<AbstractClient<Chain>> {
self.clients
.get(chain_id)
.cloned()
.ok_or(InterchainError::ChainNotFound(chain_id.to_string()))
.map_err(Into::into)
}
}