use derive_more::{AsRef, Display, From, FromStr, Into};
#[cfg(feature = "kustos")]
use kustos_shared::subject::PolicyUser;
use uuid::Uuid;
use crate::utils::ExampleData;
#[derive(
AsRef, Display, From, FromStr, Into, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash,
)]
#[cfg_attr(
feature = "diesel",
derive(
opentalk_diesel_newtype::DieselNewtype,
diesel::expression::AsExpression,
diesel::deserialize::FromSqlRow
)
)]
#[cfg_attr(feature="diesel",
diesel(sql_type = diesel::sql_types::Uuid),
)]
#[cfg_attr(feature = "kustos", derive(opentalk_kustos_prefix::KustosPrefix))]
#[cfg_attr(feature = "kustos", kustos_prefix("/users/"))]
#[cfg_attr(
feature = "redis",
derive(redis_args::ToRedisArgs, redis_args::FromRedisValue)
)]
#[cfg_attr(feature = "redis", to_redis_args(fmt), from_redis_value(FromStr))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema), schema(
example = json!(
UserId::example_data()
)
))]
pub struct UserId(Uuid);
impl UserId {
pub const fn nil() -> Self {
Self(Uuid::nil())
}
pub const fn from_u128(id: u128) -> Self {
Self(Uuid::from_u128(id))
}
#[cfg(feature = "rand")]
pub fn generate() -> Self {
Self(Uuid::new_v4())
}
}
#[cfg(feature = "kustos")]
impl From<UserId> for PolicyUser {
fn from(id: UserId) -> Self {
Self::from(Uuid::from(id))
}
}
impl ExampleData for UserId {
fn example_data() -> Self {
Self::from_u128(0x9988998899889988000000000)
}
}