diff --git a/objc2/src/rc/id_traits.rs b/objc2/src/rc/id_traits.rs index 65d14de94..0cc7fcac5 100644 --- a/objc2/src/rc/id_traits.rs +++ b/objc2/src/rc/id_traits.rs @@ -1,5 +1,7 @@ //! Various helper traits for implementing Id on foreign types / traits on Id. +use core::convert::Infallible; + use super::{Id, Owned, Ownership}; use crate::Message; @@ -69,3 +71,51 @@ impl Default for Id { T::default_id() } } + +pub trait FromId { + fn from_id(obj: Id) -> Self; +} + +pub trait TryFromId: Sized { + type Error; + fn try_from_id(obj: Id) -> Result; +} + +impl> TryFromId for U { + type Error = Infallible; + + fn try_from_id(obj: Id) -> Result { + Ok(FromId::from_id(obj)) + } +} + +/// TODO. +/// +/// This is similar to [`Into`] in that it is implemented automatically for +/// all [`Id`] that implement [`FromId`]; but you will have to implement this +/// yourself in many more cases! +pub trait IntoId { + fn into_id(self) -> Id; +} + +impl IntoId for Id +where + Id: FromId, +{ + fn into_id(self) -> Id { + FromId::from_id(self) + } +} + +pub trait TryIntoId { + type Error; + fn try_into_id(self) -> Result, Self::Error>; +} + +impl> TryIntoId for U { + type Error = Infallible; + + fn try_into_id(self) -> Result, Self::Error> { + Ok(IntoId::into_id(self)) + } +} diff --git a/objc2/src/rc/mod.rs b/objc2/src/rc/mod.rs index 3cd611d70..6a8b4f56f 100644 --- a/objc2/src/rc/mod.rs +++ b/objc2/src/rc/mod.rs @@ -35,7 +35,7 @@ mod weak_id; pub use self::autorelease::{autoreleasepool, AutoreleasePool, AutoreleaseSafe}; pub use self::id::Id; -pub use self::id_traits::{DefaultId, SliceId, SliceIdMut}; +pub use self::id_traits::{DefaultId, FromId, IntoId, SliceId, SliceIdMut, TryFromId, TryIntoId}; pub use self::ownership::{Owned, Ownership, Shared}; pub use self::weak_id::WeakId;