Skip to main content

calimero_context_primitives/client/
external.rs

1use core::ops::Deref;
2
3use calimero_context_config::client::AnyTransport;
4use calimero_primitives::context::{ContextConfigParams, ContextId};
5use calimero_store::key;
6
7use super::ContextClient;
8
9mod config;
10mod proxy;
11
12impl ContextClient {
13    pub fn context_config(
14        &self,
15        context_id: &ContextId,
16    ) -> eyre::Result<Option<ContextConfigParams<'static>>> {
17        let handle = self.datastore.handle();
18
19        let key = key::ContextConfig::new(*context_id);
20
21        let Some(config) = handle.get(&key)? else {
22            return Ok(None);
23        };
24
25        let context_config = ContextConfigParams {
26            protocol: config.protocol.into_string().into(),
27            network_id: config.network.into_string().into(),
28            contract_id: config.contract.into_string().into(),
29            proxy_contract: config.proxy_contract.into_string().into(),
30            application_revision: config.application_revision,
31            members_revision: config.members_revision,
32        };
33
34        Ok(Some(context_config))
35    }
36}
37
38#[derive(Debug)]
39pub struct ExternalClient<'a> {
40    context_id: ContextId,
41    client: &'a ContextClient,
42    config: &'a ContextConfigParams<'a>,
43}
44
45impl Deref for ExternalClient<'_> {
46    type Target = calimero_context_config::client::Client<AnyTransport>;
47
48    fn deref(&self) -> &Self::Target {
49        &self.client.external_client
50    }
51}
52
53impl ExternalClient<'_> {
54    const fn context_client(&self) -> &ContextClient {
55        self.client
56    }
57}
58
59impl ContextClient {
60    pub const fn external_client<'a>(
61        &'a self,
62        context_id: &ContextId,
63        config: &'a ContextConfigParams<'a>,
64    ) -> eyre::Result<ExternalClient<'a>> {
65        Ok(ExternalClient {
66            context_id: *context_id,
67            client: self,
68            config,
69        })
70    }
71}