talk_api_internal/
client.rs

1use crate::{config::Config, credential::Credential, RequestResult};
2use reqwest::{header, Client, Method, Request, RequestBuilder};
3use url::Url;
4
5#[derive(Debug, Clone)]
6pub struct ApiClient<'a> {
7    credential: Credential<'a>,
8    inner: TalkHttpClient<'a>,
9}
10
11impl<'a> ApiClient<'a> {
12    pub const fn new(credential: Credential<'a>, inner: TalkHttpClient<'a>) -> Self {
13        Self { credential, inner }
14    }
15
16    pub fn request(self, method: Method, end_point: &str) -> RequestResult<RequestBuilder> {
17        Ok(self.inner.request(method, end_point)?.header(
18            header::AUTHORIZATION,
19            format!(
20                "{}-{}",
21                self.credential.access_token, self.credential.device_uuid
22            ),
23        ))
24    }
25}
26
27#[derive(Debug, Clone)]
28pub struct TalkHttpClient<'a> {
29    pub config: Config<'a>,
30    url: Url,
31    client: Client,
32}
33
34impl<'a> TalkHttpClient<'a> {
35    pub const fn new(config: Config<'a>, url: Url, client: Client) -> Self {
36        Self {
37            config,
38            url,
39            client,
40        }
41    }
42
43    pub fn request(self, method: Method, end_point: &str) -> RequestResult<RequestBuilder> {
44        let user_agent = self.config.get_user_agent();
45
46        let url = self
47            .url
48            .join(&format!("{}/{}", self.config.agent.agent(), end_point))?;
49
50        let host = url.host_str().map(ToString::to_string);
51
52        let mut builder = RequestBuilder::from_parts(self.client, Request::new(method, url))
53            .header(header::USER_AGENT, user_agent)
54            .header(
55                "A",
56                format!(
57                    "{}/{}/{}",
58                    self.config.agent.agent(),
59                    self.config.version,
60                    self.config.language
61                ),
62            )
63            .header(header::ACCEPT, "*/*")
64            .header(header::ACCEPT_LANGUAGE, self.config.language);
65
66        if let Some(host) = host {
67            builder = builder.header(header::HOST, host);
68        }
69
70        Ok(builder)
71    }
72}