Skip to main content

spacetraders_client/client/
mod.rs

1mod error;
2mod scheduler;
3mod send;
4mod utils;
5
6pub use error::{ClientError, RetryPolicy};
7pub use scheduler::{RequestPriority, RequestScheduler};
8pub use utils::{RequestActivitySnapshot, request_activity_snapshot};
9
10pub(crate) type PError<E> = progenitor_client::Error<E>;
11pub(crate) use utils::{classify_status, retry_after_from_headers};
12
13pub struct StClient {
14    pub(crate) base_url: String,
15    pub(crate) token: String,
16    pub(crate) scheduler: RequestScheduler,
17    pub(crate) http: reqwest::Client,
18    pub(crate) inner: crate::generated::Client,
19}
20
21impl StClient {
22    /// Construct a client against `base_url` (e.g. `https://api.spacetraders.io/v2`)
23    /// authenticated with `token`, sharing the given [`RequestScheduler`] for
24    /// rate limiting. Clone a single scheduler across clients to share one budget.
25    ///
26    /// ```no_run
27    /// use spacetraders_client::{RequestScheduler, StClient};
28    ///
29    /// let client = StClient::new(
30    ///     "https://api.spacetraders.io/v2",
31    ///     std::env::var("AGENT_TOKEN").unwrap(),
32    ///     RequestScheduler::new(2), // sustained requests per second
33    /// );
34    /// ```
35    pub fn new(base_url: &str, token: String, scheduler: RequestScheduler) -> Self {
36        let base_url = base_url.trim_end_matches('/').to_string();
37        let inner = Self::build_inner(&base_url, &token);
38        Self {
39            base_url,
40            token,
41            scheduler,
42            http: reqwest::Client::new(),
43            inner,
44        }
45    }
46
47    fn build_inner(base_url: &str, token: &str) -> crate::generated::Client {
48        let mut headers = reqwest::header::HeaderMap::new();
49        headers.insert(
50            reqwest::header::AUTHORIZATION,
51            format!("Bearer {token}")
52                .parse()
53                .expect("invalid bearer token"),
54        );
55        let http = reqwest::Client::builder()
56            .default_headers(headers)
57            .build()
58            .expect("failed to build reqwest client");
59        crate::generated::Client::new_with_client(base_url, http)
60    }
61
62    pub fn set_token(&mut self, token: String) {
63        self.token = token.clone();
64        self.inner = Self::build_inner(&self.base_url, &token);
65    }
66
67    pub fn token(&self) -> &str {
68        &self.token
69    }
70}