use chrono::Utc;
use uuid::Uuid;
#[must_use]
pub fn uuid7_str(prefix: &str) -> String {
format!("{}{}", prefix, Uuid::now_v7())
}
#[must_use]
pub fn utcnow_str() -> i64 {
Utc::now().timestamp()
}
pub fn serialize_to_string<T: serde::Serialize>(value: &T) -> Result<String, serde_json::Error> {
serde_json::to_string(value)
}
pub fn serialize_to_value<T: serde::Serialize>(value: &T) -> Result<serde_json::Value, serde_json::Error> {
serde_json::to_value(value)
}
pub fn serialize_to_value_or_custom_default<T: serde::Serialize, R>(
value: &T,
message: &str,
then: impl FnOnce(serde_json::Value) -> R,
default: R,
) -> R {
match serde_json::to_value(value) {
Ok(config) => then(config),
Err(error) => {
tracing::debug!(error = %error, message);
default
}
}
}
pub fn deserialize_from_str<T: serde::de::DeserializeOwned>(json_str: &str) -> Result<T, serde_json::Error> {
serde_json::from_str(json_str)
}
#[must_use]
pub fn deserialize_from_str_or_default<T: serde::de::DeserializeOwned + Default>(json_str: &str) -> T {
serde_json::from_str(json_str).unwrap_or_default()
}
#[must_use]
pub fn deserialize_from_str_opt<T: serde::de::DeserializeOwned>(json_str: &str) -> Option<T> {
serde_json::from_str(json_str).ok()
}
#[must_use]
pub fn deserialize_from_string_opt_or_default<T: serde::de::DeserializeOwned + Default>(
json_str: &Option<String>,
) -> T {
json_str
.as_ref()
.and_then(|s| deserialize_from_str_opt::<T>(s))
.unwrap_or_default()
}
#[must_use]
pub fn deserialize_from_string_opt<T: serde::de::DeserializeOwned>(json_str: &Option<String>) -> Option<T> {
json_str.as_ref().and_then(|s| deserialize_from_str_opt::<T>(s))
}
pub fn deserialize_from_value<T: serde::de::DeserializeOwned>(
value: serde_json::Value,
) -> Result<T, serde_json::Error> {
serde_json::from_value(value)
}
pub fn deserialize_from_value_or_custom_default<T: serde::de::DeserializeOwned, R>(
value: serde_json::Value,
message: &str,
then: impl FnOnce(T) -> R,
default: R,
) -> R {
match serde_json::from_value(value) {
Ok(value) => then(value),
Err(error) => {
tracing::debug!(error = %error, message);
default
}
}
}
#[must_use]
pub fn deserialize_from_value_opt<T: serde::de::DeserializeOwned>(value: serde_json::Value) -> Option<T> {
serde_json::from_value(value).ok()
}
#[must_use]
pub fn serialize_to_vec_or_default<T: serde::Serialize>(value: &T) -> Vec<u8> {
serde_json::to_vec(value).unwrap_or_default()
}