talk_api_internal/
client.rs1use 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}