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 {}