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