use core::fmt;
use aranya_daemon_api as api;
use aranya_id::{custom_id, Id, IdTag};
use crate::{
client::{DeviceId, LabelId, RoleId, TeamId},
util::ApiId,
};
custom_id! {
pub struct ObjectId;
}
impl ApiId<api::ObjectId> for ObjectId {}
pub(crate) trait IsObjectId {}
impl IsObjectId for RoleId {}
impl IsObjectId for DeviceId {}
impl IsObjectId for LabelId {}
impl IsObjectId for TeamId {}
impl IsObjectId for ObjectId {}
pub(crate) trait ToObjectId: fmt::Debug {
fn to_object_id(self) -> ObjectId;
}
impl<Tag> ToObjectId for Id<Tag>
where
Tag: IdTag,
Id<Tag>: IsObjectId,
{
fn to_object_id(self) -> ObjectId {
ObjectId::transmute(self)
}
}
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub struct Rank(api::Rank);
impl Rank {
pub const fn new(value: i64) -> Self {
Self(api::Rank::new(value))
}
pub const fn value(self) -> i64 {
self.0.value()
}
pub(crate) fn into_api(self) -> api::Rank {
self.0
}
pub(crate) fn from_api(r: api::Rank) -> Self {
Self(r)
}
}
impl From<i64> for Rank {
fn from(value: i64) -> Self {
Self::new(value)
}
}
impl fmt::Display for Rank {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}