use base64ct::{Base64UrlUnpadded, Encoding};
use convert_case::{Case, Casing};
use nanoid::nanoid;
use serde::{de::Deserialize, Serialize};
use std::fmt::Debug;
use crate::error;
const ALPHABET: [char; 26] = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z',
];
pub fn rand_id() -> String {
let id = nanoid!(16, &ALPHABET);
id
}
pub fn variant_string<T: Debug>(t: T) -> String {
let printed = format!("{:?}", t);
let parts = printed
.split(|c: char| !c.is_alphanumeric())
.collect::<Vec<_>>();
parts[2].to_case(Case::Kebab)
}
pub fn from_urlsafe(base64: &str) -> Result<serde_json::Value, error::Error> {
let decoded = Base64UrlUnpadded::decode_vec(base64)?;
serde_json::from_slice(&decoded)?
}
pub trait Base64JSON {
fn to_urlsafe(&self) -> Result<String, error::Error>
where
Self: Serialize,
{
let serialized = serde_json::to_string(&self)?;
Ok(Base64UrlUnpadded::encode_string(serialized.as_bytes()))
}
fn from_urlsafe(base64: &str) -> Result<Self, error::Error>
where
Self: for<'a> Deserialize<'a>,
{
let decoded = Base64UrlUnpadded::decode_vec(base64)?;
serde_json::from_slice(&decoded)?
}
}