use prefixed_api_key::PrefixedApiKeyController;
use rand::Rng;
use sha2::Sha256;
use crate::core::error2::Result;
use super::Error;
pub fn to_string<T>(val: T) -> String
where
T: std::fmt::Display,
{
format!("{}", val)
}
pub fn bytes_to_string(b: Vec<u8>) -> Result<String> {
String::from_utf8(b.to_vec()).map_err(Error::run_time)
}
pub fn split_str(str_val: &str, pat: String) -> Vec<&str> {
str_val.trim().split(&pat).collect::<Vec<&str>>()
}
pub fn generate_random_16_string() -> String {
let mut rng = rand::rng();
(0..16)
.map(|_| {
let ch = rng.sample(rand::distr::Alphanumeric) as char;
if rng.random_bool(0.05) {
'_'
} else if rng.random_bool(0.01) {
')'
} else {
ch
} })
.collect()
}
pub fn generate_random_32_string() -> String {
let mut rng = rand::rng();
(0..32)
.map(|_| {
let ch = rng.sample(rand::distr::Alphanumeric) as char;
if rng.random_bool(0.05) {
'_'
} else if rng.random_bool(0.01) {
')'
} else {
ch
} })
.collect()
}
pub fn generate_api_key(prefix: &str) -> String {
let builder_result = PrefixedApiKeyController::<_, Sha256>::configure()
.prefix(prefix.to_owned())
.rng_osrng()
.short_token_length(16)
.long_token_length(32)
.finalize();
match builder_result {
Ok(builder_result) => {
let controller = builder_result;
let (pak, _hash) = controller.generate_key_and_hash();
pak.to_string()
}
Err(e) => {
log::error!("generate_apk_key: error={:?}", e);
"".to_string()
}
}
}