#[cfg(any(feature = "app-server-types", feature = "authnz-server-types"))]
use impulse_server_kit::salvo;
#[cfg(any(feature = "app-server-types", feature = "authnz-server-types"))]
use salvo::oapi::ToSchema;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, PartialEq, Eq, Hash, Clone, Debug)]
#[cfg_attr(any(feature = "app-server-types", feature = "authnz-server-types"), derive(ToSchema))]
pub struct TokenBundle {
pub(crate) access: String,
pub(crate) refresh: String,
pub(crate) client: Option<String>,
}
impl TokenBundle {
pub fn new_basic(act: impl ToString, rft: impl ToString) -> Self {
Self {
access: act.to_string(),
refresh: rft.to_string(),
client: None,
}
}
pub fn new_with_cba(act: impl ToString, rft: impl ToString, cba: impl ToString) -> Self {
Self {
access: act.to_string(),
refresh: rft.to_string(),
client: Some(cba.to_string()),
}
}
pub fn act(&self) -> &str {
self.access.as_str()
}
pub fn rft(&self) -> &str {
self.refresh.as_str()
}
pub fn cba(&self) -> Option<&str> {
self.client.as_deref()
}
pub fn into_parts(self) -> (String, String, Option<String>) {
(self.access, self.refresh, self.client)
}
pub fn pack(&self) -> String {
format!(
"{}:::{}:::{}",
self.access,
self.refresh,
self.client.as_deref().unwrap_or_default()
)
}
pub fn set_act(&mut self, act: impl ToString) {
self.access = act.to_string();
}
pub fn set_rft(&mut self, rft: impl ToString) {
self.refresh = rft.to_string();
}
pub fn set_cba(&mut self, cba: Option<impl ToString>) {
self.client = cba.map(|token| token.to_string());
}
#[allow(clippy::unwrap_used)]
pub fn unpack(tokens: impl AsRef<str>) -> Option<Self> {
let parts = tokens.as_ref().split(":::").collect::<Vec<_>>();
if parts.len() != 3 {
return None;
}
let access = parts.first().unwrap().to_string();
let refresh = parts.get(1).unwrap().to_string();
let client = if let Some(client) = parts.last()
&& !client.is_empty()
{
Some(client.to_string())
} else {
None
};
Some(Self { access, refresh, client })
}
}