dfns_sdk_rs/client/
api_client.rs

1// @dfns-sdk-rs/src/client/api_client.rs
2
3use crate::{
4    api::{
5        auth::client::AuthClient, exchanges::client::ExchangesClient,
6        networks::client::NetworksClient, permissions::client::PermissionsClient,
7        policies::client::PoliciesClient, signers::client::SignersClient,
8        staking::client::StakingClient, wallets::client::WalletsClient,
9        webhooks::client::WebhooksClient,
10    },
11    models::generic::{DfnsApiClientOptions, DfnsBaseApiOptions},
12    signer::CredentialSigner,
13};
14use std::sync::Arc;
15
16pub struct DfnsApiClient {
17    base_options: DfnsBaseApiOptions,
18    signer: Option<Arc<dyn CredentialSigner>>,
19}
20
21impl DfnsApiClient {
22    pub fn new(
23        base_options: DfnsBaseApiOptions,
24        signer: Option<Arc<dyn CredentialSigner>>,
25    ) -> Self {
26        Self {
27            base_options,
28            signer,
29        }
30    }
31
32    fn get_api_options(&self) -> DfnsApiClientOptions {
33        DfnsApiClientOptions {
34            base: self.base_options.clone(),
35            signer: self.signer.as_ref().map(|s| {
36                let cloned = Arc::clone(s);
37                Box::new(ClonedSigner(cloned)) as Box<dyn CredentialSigner>
38            }),
39        }
40    }
41
42    pub fn auth(&self) -> AuthClient {
43        AuthClient::new(self.get_api_options())
44    }
45
46    pub fn exchanges(&self) -> ExchangesClient {
47        ExchangesClient::new(self.get_api_options())
48    }
49
50    pub fn networks(&self) -> NetworksClient {
51        NetworksClient::new(self.get_api_options())
52    }
53
54    pub fn permissions(&self) -> PermissionsClient {
55        PermissionsClient::new(self.get_api_options())
56    }
57
58    pub fn policies(&self) -> PoliciesClient {
59        PoliciesClient::new(self.get_api_options())
60    }
61
62    pub fn staking(&self) -> StakingClient {
63        StakingClient::new(self.get_api_options())
64    }
65
66    pub fn signers(&self) -> SignersClient {
67        SignersClient::new(self.get_api_options())
68    }
69
70    pub fn wallets(&self) -> WalletsClient {
71        WalletsClient::new(self.get_api_options())
72    }
73
74    pub fn webhooks(&self) -> WebhooksClient {
75        WebhooksClient::new(self.get_api_options())
76    }
77}
78
79struct ClonedSigner(Arc<dyn CredentialSigner + Send + Sync>);
80
81#[async_trait::async_trait]
82impl CredentialSigner for ClonedSigner {
83    async fn sign(
84        &self,
85        challenge: crate::signer::UserActionChallenge,
86    ) -> Result<crate::signer::FirstFactorAssertion, crate::error::DfnsError> {
87        self.0.sign(challenge).await
88    }
89}