use crate::{
error::ErrorMessage,
model::{common::AccountID, common::Username},
};
use serde::{Deserialize, Serialize};
use std::convert::TryFrom;
use std::fmt;
use time::{serde::timestamp, OffsetDateTime};
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ClientID(pub String);
impl TryFrom<String> for ClientID {
type Error = ErrorMessage;
fn try_from(value: String) -> Result<Self, Self::Error> {
if value.is_empty() {
return Err(ErrorMessage::new("Invalid length"));
}
Ok(ClientID(value))
}
}
impl fmt::Display for ClientID {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ClientSecret(pub String);
impl TryFrom<String> for ClientSecret {
type Error = ErrorMessage;
fn try_from(value: String) -> Result<Self, Self::Error> {
if value.is_empty() {
return Err(ErrorMessage::new("Invalid length"));
}
Ok(ClientSecret(value))
}
}
impl fmt::Display for ClientSecret {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AccessToken(pub String);
impl TryFrom<String> for AccessToken {
type Error = ErrorMessage;
fn try_from(value: String) -> Result<Self, Self::Error> {
if value.is_empty() {
return Err(ErrorMessage::new("Invalid length"));
}
Ok(AccessToken(value))
}
}
impl fmt::Display for AccessToken {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RefreshToken(pub String);
impl TryFrom<String> for RefreshToken {
type Error = ErrorMessage;
fn try_from(value: String) -> Result<Self, Self::Error> {
if value.is_empty() {
return Err(ErrorMessage::new("Invalid length"));
}
Ok(RefreshToken(value))
}
}
impl fmt::Display for RefreshToken {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AuthorizationCode(pub String);
impl TryFrom<String> for AuthorizationCode {
type Error = ErrorMessage;
fn try_from(value: String) -> Result<Self, Self::Error> {
if value.is_empty() {
return Err(ErrorMessage::new("Invalid length"));
}
Ok(AuthorizationCode(value))
}
}
impl fmt::Display for AuthorizationCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct PINCode(pub String);
impl TryFrom<String> for PINCode {
type Error = ErrorMessage;
fn try_from(value: String) -> Result<Self, Self::Error> {
if value.is_empty() {
return Err(ErrorMessage::new("Invalid length"));
}
Ok(PINCode(value))
}
}
impl fmt::Display for PINCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TokenType(pub String);
impl fmt::Display for TokenType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AuthorizationResponse {
pub access_token: AccessToken,
pub account_id: AccountID,
pub account_username: Username,
#[serde(with = "timestamp")]
pub expires_in: OffsetDateTime,
pub refresh_token: RefreshToken,
pub scope: serde_json::Value,
pub token_type: TokenType,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RefreshResponse {
pub access_token: AccessToken,
pub account_id: AccountID,
pub account_username: Username,
#[serde(with = "timestamp")]
pub expires_in: OffsetDateTime,
pub refresh_token: RefreshToken,
pub scope: serde_json::Value,
pub token_type: TokenType,
}