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