bitwarden_auth/send_access/
access_token_response.rs1use std::fmt::Debug;
2
3use crate::send_access::api::{SendAccessTokenApiErrorResponse, SendAccessTokenApiSuccessResponse};
4
5#[derive(serde::Serialize, serde::Deserialize, Clone)]
7#[serde(rename_all = "camelCase", deny_unknown_fields)]
8#[cfg_attr(
9 feature = "wasm",
10 derive(tsify::Tsify),
11 tsify(into_wasm_abi, from_wasm_abi)
12)]
13#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
14#[derive(Debug)]
15pub struct SendAccessTokenResponse {
16 pub token: String,
18 pub expires_at: i64,
20}
21
22impl From<SendAccessTokenApiSuccessResponse> for SendAccessTokenResponse {
23 fn from(response: SendAccessTokenApiSuccessResponse) -> Self {
24 let expires_at =
28 chrono::Utc::now().timestamp_millis() + (response.expires_in * 1000) as i64;
29
30 SendAccessTokenResponse {
31 token: response.access_token,
32 expires_at,
33 }
34 }
35}
36
37#[bitwarden_error::bitwarden_error(full)]
40#[derive(Debug, thiserror::Error)]
41#[serde(tag = "kind", content = "data", rename_all = "lowercase")]
42pub enum SendAccessTokenError {
45 #[error("Unexpected Error response: {0:?}")]
46 Unexpected(UnexpectedIdentityError),
50
51 #[error("Expected error response")]
52 Expected(SendAccessTokenApiErrorResponse),
54}
55
56impl From<reqwest::Error> for SendAccessTokenError {
58 fn from(value: reqwest::Error) -> Self {
59 Self::Unexpected(UnexpectedIdentityError(format!("{value:?}")))
60 }
61}
62impl From<reqwest_middleware::Error> for SendAccessTokenError {
63 fn from(value: reqwest_middleware::Error) -> Self {
64 Self::Unexpected(UnexpectedIdentityError(format!("{value:?}")))
65 }
66}
67
68#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
75#[serde(transparent)]
76#[cfg_attr(
77 feature = "wasm",
78 derive(tsify::Tsify),
79 tsify(into_wasm_abi, from_wasm_abi)
80)]
81pub struct UnexpectedIdentityError(pub String);
82
83#[cfg(feature = "uniffi")] uniffi::custom_newtype!(UnexpectedIdentityError, String);