use std::fmt::Display;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use crate::{to_query, IntoParams, SetCursor};
#[derive(Serialize, Deserialize, Clone, Copy, Debug)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SessionStatus {
Ready,
Active,
Cancelled,
Revoked,
AccessLost,
}
impl Display for SessionStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Ready => write!(f, "READY"),
Self::Active => write!(f, "ACTIVE"),
Self::Cancelled => write!(f, "CANCELLED"),
Self::Revoked => write!(f, "REVOKED"),
Self::AccessLost => write!(f, "ACCESS_LOST"),
}
}
}
#[derive(Clone, Debug, Default)]
pub struct SessionQuery {
pub status: Option<SessionStatus>,
pub cursor: Option<String>,
pub limit: Option<u32>,
}
impl SetCursor for SessionQuery {
fn set_cursor(&mut self, cursor: Option<String>) {
self.cursor = cursor;
}
}
impl IntoParams for SessionQuery {
fn into_params(self) -> Vec<(String, String)> {
let mut params = vec![];
to_query("status", &self.status, &mut params);
to_query("cursor", &self.cursor, &mut params);
to_query("limit", &self.limit, &mut params);
params
}
}
#[skip_serializing_none]
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Session {
pub id: i64,
pub r#type: Option<String>,
pub status: SessionStatus,
pub creation_time: Option<i64>,
pub expiration_time: Option<i64>,
pub nonce: Option<String>,
pub client_id: Option<String>,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(untagged, rename_all_fields = "camelCase")]
pub enum AddSession {
ClientCredentials {
client_id: String,
client_secret: String,
},
TokenExchange {
token_exchange: bool,
},
}