talk_api_internal/auth/
client.rs

1use reqwest::{Method, RequestBuilder};
2use serde::Serialize;
3
4use crate::{client::TalkHttpClient, RequestResult};
5
6use super::xvc::XvcHasher;
7
8#[derive(Debug, Clone)]
9pub struct AuthClient<'a, Xvc> {
10    pub device: Device<'a>,
11    pub xvc: Xvc,
12    inner: TalkHttpClient<'a>,
13}
14
15impl<'a, Xvc: XvcHasher> AuthClient<'a, Xvc> {
16    pub const fn new(device: Device<'a>, xvc: Xvc, inner: TalkHttpClient<'a>) -> Self {
17        Self { device, xvc, inner }
18    }
19
20    pub fn request(
21        self,
22        method: Method,
23        end_point: &str,
24        email: &str,
25    ) -> RequestResult<RequestBuilder> {
26        let user_agent = self.inner.config.get_user_agent();
27
28        let xvc = hex::encode(&self.xvc.full_xvc_hash(self.device.uuid, &user_agent, email)[..8]);
29
30        Ok(self.inner.request(method, end_point)?.header("X-VC", xvc))
31    }
32}
33
34#[derive(Debug, Clone, Copy, Serialize)]
35pub struct Device<'a> {
36    #[serde(rename = "device_name")]
37    pub name: &'a str,
38
39    #[serde(rename = "model_name")]
40    pub model: Option<&'a str>,
41
42    #[serde(rename = "device_uuid")]
43    pub uuid: &'a str,
44}