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        for (name, value) in &self.parameters {
18            url.push_str(&format!("{name}={value}"));
19        }
20
21        url
22    }
23}
24
25pub struct ApiResponse {
26    pub body: Option<Bytes>,
27    pub status: StatusCode,
28}
29
30pub trait IntoRequest: Send {
31    type Discriminant: Send;
32    type Response: for<'de> serde::Deserialize<'de> + Send;
33    fn into_request(self) -> (Self::Discriminant, ApiRequest);
34}
35
36pub(crate) struct WrappedApiRequest<R>
37where
38    R: IntoRequest,
39{
40    discriminant: R::Discriminant,
41    request: ApiRequest,
42}
43
44impl<R> IntoRequest for WrappedApiRequest<R>
45where
46    R: IntoRequest,
47{
48    type Discriminant = R::Discriminant;
49    type Response = R::Response;
50    fn into_request(self) -> (Self::Discriminant, ApiRequest) {
51        (self.discriminant, self.request)
52    }
53}
54
55#[cfg(test)]
56mod test {}