1#[cfg(feature = "async")]
2use std::{future::Future, pin::Pin};
3
4use std::sync::{Arc, Mutex};
5
6#[cfg(any(feature = "async", feature = "sync"))]
7use std::time::Duration;
8
9#[cfg(feature = "subscriptions")]
10use crate::socket::Socket;
11use crate::{
12 rate_limiter::RateLimiter,
13 request::{Client, Headers},
14};
15
16#[derive(Debug)]
17pub struct Config {
18 pub api_key: String,
19 pub verified_bot_key: Option<String>,
20 pub verified_bot_key_api_key: Option<String>,
21 pub api_url: String,
22 #[cfg(feature = "subscriptions")]
23 pub socket_url: String,
24 #[cfg(feature = "subscriptions")]
25 pub subscribe_url: String,
26 #[cfg(feature = "subscriptions")]
27 pub subscription_auth_url: String,
28 pub rate_limiter: Arc<Mutex<RateLimiter>>,
29 #[cfg(feature = "subscriptions")]
30 pub socket: Box<dyn Socket>,
31 pub client: Box<dyn Client>,
32 pub headers: Headers,
33 pub now: fn() -> u64,
34 #[cfg(feature = "async")]
35 pub sleep: fn(Duration) -> Pin<Box<dyn Future<Output = ()> + Send + Sync>>,
36 #[cfg(feature = "sync")]
37 pub sleep_sync: fn(Duration) -> (),
38 pub user_agent: String,
39}
40
41impl Config {
42 pub fn update_headers(mut self) -> Self {
43 self.headers
44 .set_authorization(format!("Bearer {}", self.api_key));
45 if let Some(verified_bot_key) = &self.verified_bot_key {
46 self.headers.set_x_bot_key(verified_bot_key.clone());
47 }
48 if let Some(verified_bot_key_api_key) = &self.verified_bot_key_api_key {
49 self.headers.set_x_api_key(verified_bot_key_api_key.clone());
50 }
51 self.headers.set_user_agent(self.user_agent.clone());
52 self
53 }
54
55 pub fn set_api_key(mut self, api_key: String) -> Self {
56 self.api_key = api_key;
57 self.headers
58 .set_authorization(format!("Bearer {}", self.api_key));
59 self
60 }
61
62 pub fn set_verified_bot_key(mut self, verified_bot_key: String) -> Self {
63 self.headers.set_x_bot_key(verified_bot_key.clone());
64 self.verified_bot_key = Some(verified_bot_key);
65 self
66 }
67
68 pub fn set_verified_bot_key_api_key(mut self, verified_bot_key_api_key: String) -> Self {
69 self.headers.set_x_api_key(verified_bot_key_api_key.clone());
70 self.verified_bot_key_api_key = Some(verified_bot_key_api_key);
71 self
72 }
73
74 pub fn set_api_url(mut self, api_url: String) -> Self {
75 self.api_url = api_url;
76 self
77 }
78
79 #[cfg(feature = "subscriptions")]
80 pub fn set_socket_url(mut self, socket_url: String) -> Self {
81 self.socket_url = socket_url;
82 self
83 }
84
85 #[cfg(feature = "subscriptions")]
86 pub fn set_subscribe_url(mut self, subscriptions_url: String) -> Self {
87 self.subscribe_url = subscriptions_url;
88 self
89 }
90
91 #[cfg(feature = "subscriptions")]
92 pub fn set_subscription_auth_url(mut self, subscription_auth_url: String) -> Self {
93 self.subscription_auth_url = subscription_auth_url;
94 self
95 }
96
97 pub fn set_rate_limiter(mut self, rate_limiter: RateLimiter) -> Self {
98 self.rate_limiter = Arc::new(Mutex::new(rate_limiter));
99 self
100 }
101
102 #[cfg(feature = "subscriptions")]
103 pub fn set_socket(mut self, socket: Box<dyn Socket>) -> Self {
104 self.socket = socket;
105 self
106 }
107
108 pub fn set_client(mut self, client: Box<dyn Client>) -> Self {
109 self.client = client;
110 self
111 }
112
113 pub fn set_now(mut self, now: fn() -> u64) -> Self {
114 self.now = now;
115 self
116 }
117
118 #[cfg(feature = "async")]
119 pub fn set_sleep(
120 mut self,
121 sleep: fn(Duration) -> Pin<Box<dyn Future<Output = ()> + Send + Sync>>,
122 ) -> Self {
123 self.sleep = sleep;
124 self
125 }
126
127 #[cfg(feature = "sync")]
128 pub fn set_sleep_sync(mut self, sleep_sync: fn(Duration) -> ()) -> Self {
129 self.sleep_sync = sleep_sync;
130 self
131 }
132
133 pub fn set_user_agent(mut self, user_agent: String) -> Self {
134 self.user_agent = user_agent;
135 self
136 }
137}