Skip to main content

mkt_core/
config.rs

1use std::fmt;
2
3use secrecy::ExposeSecret;
4pub use secrecy::SecretString;
5
6use mkt_types::ExchangeId;
7
8pub struct ApiCredentials {
9    api_key: SecretString,
10    secret: SecretString,
11    passphrase: Option<SecretString>,
12}
13
14impl PartialEq for ApiCredentials {
15    fn eq(&self, other: &Self) -> bool {
16        self.api_key.expose_secret() == other.api_key.expose_secret()
17            && self.secret.expose_secret() == other.secret.expose_secret()
18            && self.passphrase.as_ref().map(|value| value.expose_secret())
19                == other.passphrase.as_ref().map(|value| value.expose_secret())
20    }
21}
22
23impl Eq for ApiCredentials {}
24
25impl ApiCredentials {
26    pub fn new(api_key: impl Into<String>, secret: impl Into<String>) -> Self {
27        Self {
28            api_key: SecretString::from(api_key.into()),
29            secret: SecretString::from(secret.into()),
30            passphrase: None,
31        }
32    }
33
34    pub fn with_passphrase(mut self, passphrase: impl Into<String>) -> Self {
35        self.passphrase = Some(SecretString::from(passphrase.into()));
36        self
37    }
38
39    pub fn api_key(&self) -> &SecretString {
40        &self.api_key
41    }
42
43    pub fn secret(&self) -> &SecretString {
44        &self.secret
45    }
46
47    pub fn passphrase(&self) -> Option<&SecretString> {
48        self.passphrase.as_ref()
49    }
50}
51
52impl fmt::Debug for ApiCredentials {
53    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
54        f.debug_struct("ApiCredentials")
55            .field("api_key", &self.api_key)
56            .field("secret", &self.secret)
57            .field("passphrase", &self.passphrase)
58            .finish()
59    }
60}
61
62#[derive(Debug, PartialEq, Eq)]
63pub struct ExchangeConfig {
64    pub exchange_id: ExchangeId,
65    pub rest_base_url: Option<String>,
66    pub websocket_base_url: Option<String>,
67    pub credentials: Option<ApiCredentials>,
68}
69
70impl ExchangeConfig {
71    pub fn new(exchange_id: ExchangeId) -> Self {
72        Self {
73            exchange_id,
74            rest_base_url: None,
75            websocket_base_url: None,
76            credentials: None,
77        }
78    }
79
80    pub fn with_rest_base_url(mut self, url: impl Into<String>) -> Self {
81        self.rest_base_url = Some(url.into());
82        self
83    }
84
85    pub fn with_websocket_base_url(mut self, url: impl Into<String>) -> Self {
86        self.websocket_base_url = Some(url.into());
87        self
88    }
89
90    pub fn with_credentials(mut self, credentials: ApiCredentials) -> Self {
91        self.credentials = Some(credentials);
92        self
93    }
94}