1use std::fmt;
2
3use derive_builder::Builder;
4use secrecy::ExposeSecret;
5pub use secrecy::SecretString;
6
7use mkt_types::ExchangeId;
8
9#[derive(Builder)]
10#[builder(pattern = "owned", setter(into, strip_option))]
11pub struct ApiCredentials {
12 api_key: SecretString,
13 secret: SecretString,
14 #[builder(default)]
15 passphrase: Option<SecretString>,
16}
17
18impl PartialEq for ApiCredentials {
19 fn eq(&self, other: &Self) -> bool {
20 self.api_key.expose_secret() == other.api_key.expose_secret()
21 && self.secret.expose_secret() == other.secret.expose_secret()
22 && self.passphrase.as_ref().map(|value| value.expose_secret())
23 == other.passphrase.as_ref().map(|value| value.expose_secret())
24 }
25}
26
27impl Eq for ApiCredentials {}
28
29impl ApiCredentials {
30 pub fn builder() -> ApiCredentialsBuilder {
31 ApiCredentialsBuilder::default()
32 }
33
34 pub fn api_key(&self) -> &SecretString {
35 &self.api_key
36 }
37
38 pub fn secret(&self) -> &SecretString {
39 &self.secret
40 }
41
42 pub fn passphrase(&self) -> Option<&SecretString> {
43 self.passphrase.as_ref()
44 }
45}
46
47impl fmt::Debug for ApiCredentials {
48 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49 f.debug_struct("ApiCredentials")
50 .field("api_key", &self.api_key)
51 .field("secret", &self.secret)
52 .field("passphrase", &self.passphrase)
53 .finish()
54 }
55}
56
57#[derive(Debug, PartialEq, Eq, Builder)]
58#[builder(pattern = "owned", setter(into, strip_option))]
59pub struct ExchangeConfig {
60 pub exchange_id: ExchangeId,
61 #[builder(default)]
62 pub rest_base_url: Option<String>,
63 #[builder(default)]
64 pub websocket_base_url: Option<String>,
65 #[builder(default)]
66 pub credentials: Option<ApiCredentials>,
67}
68
69impl ExchangeConfig {
70 pub fn builder() -> ExchangeConfigBuilder {
71 ExchangeConfigBuilder::default()
72 }
73}