use std::fmt::Debug;
use crate::send_access::api::{SendAccessTokenApiErrorResponse, SendAccessTokenApiSuccessResponse};
#[derive(serde::Serialize, serde::Deserialize, Clone)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(
feature = "wasm",
derive(tsify::Tsify),
tsify(into_wasm_abi, from_wasm_abi)
)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
#[derive(Debug)]
pub struct SendAccessTokenResponse {
pub token: String,
pub expires_at: i64,
}
impl From<SendAccessTokenApiSuccessResponse> for SendAccessTokenResponse {
fn from(response: SendAccessTokenApiSuccessResponse) -> Self {
let expires_at =
chrono::Utc::now().timestamp_millis() + (response.expires_in * 1000) as i64;
SendAccessTokenResponse {
token: response.access_token,
expires_at,
}
}
}
#[bitwarden_error::bitwarden_error(full)]
#[derive(Debug, thiserror::Error)]
#[serde(tag = "kind", content = "data", rename_all = "lowercase")]
pub enum SendAccessTokenError {
#[error("Unexpected Error response: {0:?}")]
Unexpected(UnexpectedIdentityError),
#[error("Expected error response")]
Expected(SendAccessTokenApiErrorResponse),
}
impl From<reqwest::Error> for SendAccessTokenError {
fn from(value: reqwest::Error) -> Self {
Self::Unexpected(UnexpectedIdentityError(format!("{value:?}")))
}
}
impl From<reqwest_middleware::Error> for SendAccessTokenError {
fn from(value: reqwest_middleware::Error) -> Self {
Self::Unexpected(UnexpectedIdentityError(format!("{value:?}")))
}
}
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(transparent)]
#[cfg_attr(
feature = "wasm",
derive(tsify::Tsify),
tsify(into_wasm_abi, from_wasm_abi)
)]
pub struct UnexpectedIdentityError(pub String);
#[cfg(feature = "uniffi")] uniffi::custom_newtype!(UnexpectedIdentityError, String);