use leptos_router::params::{Params, ParamsError, ParamsMap};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub enum CallbackResponse {
SuccessLogin(SuccessCallbackResponse),
SuccessLogout(SuccessLogoutResponse),
Error(ErrorResponse),
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct SuccessCallbackResponse {
pub session_state: Option<String>,
pub code: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct SuccessLogoutResponse {
pub destroy_session: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(untagged)]
pub enum TokenResponse {
Success(SuccessTokenResponse),
Error(ErrorResponse),
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct SuccessTokenResponse {
pub access_token: String,
pub expires_in: i64,
pub refresh_expires_in: Option<i64>,
pub refresh_token: String,
pub token_type: Option<String>,
pub id_token: String,
#[serde(rename = "not-before-policy")]
pub not_before_policy: Option<i64>,
pub session_state: Option<String>,
pub scope: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct ErrorResponse {
pub error: String,
pub error_description: String,
}
impl Params for SuccessCallbackResponse {
fn from_map(map: &ParamsMap) -> Result<Self, ParamsError> {
if let (session_state, Some(code)) = (map.get("session_state"), map.get("code")) {
return Ok(SuccessCallbackResponse {
session_state: session_state.clone(),
code: code.clone(),
});
}
Err(ParamsError::MissingParam(
"Missing parameter 'code'".to_string(),
))
}
}
impl Params for SuccessLogoutResponse {
fn from_map(map: &ParamsMap) -> Result<Self, ParamsError> {
if let Some(destroy_session) = map.get("destroy_session") {
return Ok(SuccessLogoutResponse {
destroy_session: destroy_session.parse().unwrap_or_default(),
});
}
Err(ParamsError::MissingParam(
"Missing parameter 'destroy_session'".to_string(),
))
}
}
impl Params for ErrorResponse {
fn from_map(map: &ParamsMap) -> Result<Self, ParamsError> {
if let (Some(error), Some(error_description)) =
(map.get("error"), map.get("error_description"))
{
return Ok(ErrorResponse {
error: error.clone(),
error_description: error_description.clone(),
});
}
Err(ParamsError::MissingParam(
"Missing parameter 'error' and 'error_description'".to_string(),
))
}
}
impl Params for CallbackResponse {
fn from_map(map: &ParamsMap) -> Result<Self, ParamsError> {
if let Ok(response) = SuccessCallbackResponse::from_map(map) {
return Ok(CallbackResponse::SuccessLogin(response));
} else if let Ok(reponse) = SuccessLogoutResponse::from_map(map) {
return Ok(CallbackResponse::SuccessLogout(reponse));
} else if let Ok(reponse) = ErrorResponse::from_map(map) {
return Ok(CallbackResponse::Error(reponse));
}
Err(ParamsError::MissingParam(
"Missing parameter 'session_state' and 'code' or 'error' and 'error_description'"
.to_string(),
))
}
}