use super::{ObjectId, ServiceCookie, ServiceUuid};
#[cfg(feature = "introspection")]
use crate::introspection::{ir, Introspectable, LexicalId, References};
use crate::tags::{self, PrimaryTag};
use crate::{Deserialize, DeserializeError, Deserializer, Serialize, SerializeError, Serializer};
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(rename_all = "kebab-case")
)]
pub struct ServiceId {
pub object_id: ObjectId,
pub uuid: ServiceUuid,
pub cookie: ServiceCookie,
}
impl ServiceId {
pub const NIL: Self = Self::new(ObjectId::NIL, ServiceUuid::NIL, ServiceCookie::NIL);
pub const fn new(object_id: ObjectId, uuid: ServiceUuid, cookie: ServiceCookie) -> Self {
Self {
object_id,
uuid,
cookie,
}
}
pub const fn is_nil(self) -> bool {
self.object_id.is_nil() && self.uuid.is_nil() && self.cookie.is_nil()
}
}
impl PrimaryTag for ServiceId {
type Tag = tags::ServiceId;
}
impl Serialize<tags::ServiceId> for ServiceId {
fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
serializer.serialize_service_id(self)
}
}
impl Serialize<tags::ServiceId> for &ServiceId {
fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
serializer.serialize(*self)
}
}
impl Deserialize<tags::ServiceId> for ServiceId {
fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
deserializer.deserialize_service_id()
}
}
#[cfg(feature = "introspection")]
impl Introspectable for ServiceId {
fn layout() -> ir::LayoutIr {
ir::BuiltInTypeIr::ServiceId.into()
}
fn lexical_id() -> LexicalId {
LexicalId::SERVICE_ID
}
fn add_references(_references: &mut References) {}
}