torn_api/request/
mod.rs

1use bytes::Bytes;
2use http::StatusCode;
3
4#[cfg(feature = "requests")]
5pub mod models;
6
7#[derive(Default)]
8pub struct ApiRequest {
9    pub path: String,
10    pub parameters: Vec<(&'static str, String)>,
11}
12
13impl ApiRequest {
14    pub fn url(&self) -> String {
15        let mut url = format!("https://api.torn.com/v2{}?", self.path);
16
17        let mut first = true;
18        for (name, value) in &self.parameters {
19            if first {
20                first = false;
21            } else {
22                url.push('&');
23            }
24            url.push_str(&format!("{name}={value}"));
25        }
26
27        url
28    }
29}
30
31pub struct ApiResponse {
32    pub body: Option<Bytes>,
33    pub status: StatusCode,
34}
35
36pub trait IntoRequest: Send {
37    type Discriminant: Send + 'static;
38    type Response: for<'de> serde::Deserialize<'de> + Send;
39    fn into_request(self) -> (Self::Discriminant, ApiRequest);
40}
41
42pub(crate) struct WrappedApiRequest<R>
43where
44    R: IntoRequest,
45{
46    discriminant: R::Discriminant,
47    request: ApiRequest,
48}
49
50impl<R> IntoRequest for WrappedApiRequest<R>
51where
52    R: IntoRequest,
53{
54    type Discriminant = R::Discriminant;
55    type Response = R::Response;
56    fn into_request(self) -> (Self::Discriminant, ApiRequest) {
57        (self.discriminant, self.request)
58    }
59}
60
61#[cfg(test)]
62mod test {}