diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index d8befafdc9..d7407cf965 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -41,20 +41,17 @@ impl KmsObjects { objects } - pub(super) fn add>>(&mut self, data: U) -> KmsObjectId { + pub(super) fn add>(&mut self, data: U) -> KmsObjectId { let id = self.next_id; - self.objects.insert(id, data.into()); + self.objects.insert(id, data.into_object()); self.next_id.0 += 1; id } - pub(super) fn get<'a, U: 'a>(&'a self, id: KmsObjectId) -> Result<&'a U> - where - &'a U: TryFrom<&'a KmsObject>, - { + pub(super) fn get>(&self, id: KmsObjectId) -> Result<&U> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; - if let Ok(object) = object.try_into() { + if let Some(object) = U::try_from_object(object) { Ok(object) } else { Err(Error::new(EINVAL)) @@ -142,6 +139,11 @@ impl From for u64 { } } +pub(super) trait KmsObjectKind { + fn into_object(self) -> KmsObject; + fn try_from_object(object: &KmsObject) -> Option<&Self>; +} + macro_rules! define_object_kinds { (<$T:ident> $( $variant:ident($data:ty) = $type:ident, @@ -160,19 +162,15 @@ macro_rules! define_object_kinds { } $( - impl<$T: GraphicsAdapter> From<$data> for KmsObject<$T> { - fn from(value: $data) -> Self { - Self::$variant(value) + impl<$T: GraphicsAdapter> KmsObjectKind<$T> for $data { + fn into_object(self) -> KmsObject<$T> { + KmsObject::$variant(self) } - } - impl<'a, $T: GraphicsAdapter> TryFrom<&'a KmsObject<$T>> for &'a $data { - type Error = (); - - fn try_from(value: &'a KmsObject) -> Result { - match value { - KmsObject::$variant(data) => Ok(data), - _ => Err(()), + fn try_from_object(object: &KmsObject<$T>) -> Option<&$data> { + match object { + KmsObject::$variant(data) => Some(data), + _ => None, } } }