pub mod types;
use crate::types::SurrealJWTClaims;
use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD};
use serde::Deserialize;
use serde::de::DeserializeOwned;
use serde::{Deserializer, Serialize, de::Error};
use surrealdb::RecordId;
pub fn decode_payload_insecurely<T>(
token: &str,
) -> Result<SurrealJWTClaims<T>, Box<dyn std::error::Error>>
where
T: DeserializeOwned + Serialize,
{
let mut parts = token.split('.');
let payload_b64 = parts.nth(1).ok_or("Invalid JWT format: missing payload")?;
let decoded_payload_bytes = URL_SAFE_NO_PAD.decode(payload_b64)?;
let claims: SurrealJWTClaims<T> = serde_json::from_slice(&decoded_payload_bytes)?;
Ok(claims)
}
pub fn deserialize_record_id<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let value: Option<RecordId> = Option::deserialize(deserializer)?;
match value {
Some(id) => Ok(id.key().to_string()),
None => Err(D::Error::custom("RecordId cannot be None")),
}
}
pub fn deserialize_record_id_option<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
where
D: Deserializer<'de>,
{
let value: Option<RecordId> = Option::deserialize(deserializer)?;
match value {
Some(id) => Ok(Some(id.key().to_string())),
None => Ok(None),
}
}
pub fn serialize_record_id<S>(id: &RecordId, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&id.key().to_string())
}
pub fn serialize_record_id_option<S>(
id: &Option<RecordId>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match id {
Some(record_id) => serializer.serialize_str(&record_id.key().to_string()),
None => serializer.serialize_none(),
}
}