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}