Use associated types for Ap traits
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build was killed

This commit is contained in:
asonix 2022-12-06 17:47:16 -06:00
parent a0fef3abc4
commit 1887e9edfb
7 changed files with 116 additions and 86 deletions

View file

@ -53,15 +53,17 @@ where
}
}
impl<Inner, A, ApInner> AsApObject<ApInner> for Ext1<Inner, A>
impl<Inner, A> AsApObject for Ext1<Inner, A>
where
Inner: AsApObject<ApInner>,
Inner: AsApObject,
{
fn ap_object_ref(&self) -> &ApObject<ApInner> {
type Inner = Inner::Inner;
fn ap_object_ref(&self) -> &ApObject<Self::Inner> {
self.inner.ap_object_ref()
}
fn ap_object_mut(&mut self) -> &mut ApObject<ApInner> {
fn ap_object_mut(&mut self) -> &mut ApObject<Self::Inner> {
self.inner.ap_object_mut()
}
}
@ -96,15 +98,17 @@ where
}
}
impl<Inner, A, ApInner> AsApActor<ApInner> for Ext1<Inner, A>
impl<Inner, A> AsApActor for Ext1<Inner, A>
where
Inner: AsApActor<ApInner>,
Inner: AsApActor,
{
fn ap_actor_ref(&self) -> &ApActor<ApInner> {
type Inner = Inner::Inner;
fn ap_actor_ref(&self) -> &ApActor<Self::Inner> {
self.inner.ap_actor_ref()
}
fn ap_actor_mut(&mut self) -> &mut ApActor<ApInner> {
fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner> {
self.inner.ap_actor_mut()
}
}

View file

@ -53,15 +53,17 @@ where
}
}
impl<Inner, A, B, ApInner> AsApObject<ApInner> for Ext2<Inner, A, B>
impl<Inner, A, B> AsApObject for Ext2<Inner, A, B>
where
Inner: AsApObject<ApInner>,
Inner: AsApObject,
{
fn ap_object_ref(&self) -> &ApObject<ApInner> {
type Inner = Inner::Inner;
fn ap_object_ref(&self) -> &ApObject<Self::Inner> {
self.inner.ap_object_ref()
}
fn ap_object_mut(&mut self) -> &mut ApObject<ApInner> {
fn ap_object_mut(&mut self) -> &mut ApObject<Self::Inner> {
self.inner.ap_object_mut()
}
}
@ -96,15 +98,17 @@ where
}
}
impl<Inner, A, B, ApInner> AsApActor<ApInner> for Ext2<Inner, A, B>
impl<Inner, A, B> AsApActor for Ext2<Inner, A, B>
where
Inner: AsApActor<ApInner>,
Inner: AsApActor,
{
fn ap_actor_ref(&self) -> &ApActor<ApInner> {
type Inner = Inner::Inner;
fn ap_actor_ref(&self) -> &ApActor<Self::Inner> {
self.inner.ap_actor_ref()
}
fn ap_actor_mut(&mut self) -> &mut ApActor<ApInner> {
fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner> {
self.inner.ap_actor_mut()
}
}

View file

@ -56,15 +56,17 @@ where
}
}
impl<Inner, A, B, C, ApInner> AsApObject<ApInner> for Ext3<Inner, A, B, C>
impl<Inner, A, B, C> AsApObject for Ext3<Inner, A, B, C>
where
Inner: AsApObject<ApInner>,
Inner: AsApObject,
{
fn ap_object_ref(&self) -> &ApObject<ApInner> {
type Inner = Inner::Inner;
fn ap_object_ref(&self) -> &ApObject<Self::Inner> {
self.inner.ap_object_ref()
}
fn ap_object_mut(&mut self) -> &mut ApObject<ApInner> {
fn ap_object_mut(&mut self) -> &mut ApObject<Self::Inner> {
self.inner.ap_object_mut()
}
}
@ -99,15 +101,17 @@ where
}
}
impl<Inner, A, B, C, ApInner> AsApActor<ApInner> for Ext3<Inner, A, B, C>
impl<Inner, A, B, C> AsApActor for Ext3<Inner, A, B, C>
where
Inner: AsApActor<ApInner>,
Inner: AsApActor,
{
fn ap_actor_ref(&self) -> &ApActor<ApInner> {
type Inner = Inner::Inner;
fn ap_actor_ref(&self) -> &ApActor<Self::Inner> {
self.inner.ap_actor_ref()
}
fn ap_actor_mut(&mut self) -> &mut ApActor<ApInner> {
fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner> {
self.inner.ap_actor_mut()
}
}

View file

@ -59,15 +59,17 @@ where
}
}
impl<Inner, A, B, C, D, ApInner> AsApObject<ApInner> for Ext4<Inner, A, B, C, D>
impl<Inner, A, B, C, D> AsApObject for Ext4<Inner, A, B, C, D>
where
Inner: AsApObject<ApInner>,
Inner: AsApObject,
{
fn ap_object_ref(&self) -> &ApObject<ApInner> {
type Inner = Inner::Inner;
fn ap_object_ref(&self) -> &ApObject<Self::Inner> {
self.inner.ap_object_ref()
}
fn ap_object_mut(&mut self) -> &mut ApObject<ApInner> {
fn ap_object_mut(&mut self) -> &mut ApObject<Self::Inner> {
self.inner.ap_object_mut()
}
}
@ -102,15 +104,17 @@ where
}
}
impl<Inner, A, B, C, D, ApInner> AsApActor<ApInner> for Ext4<Inner, A, B, C, D>
impl<Inner, A, B, C, D> AsApActor for Ext4<Inner, A, B, C, D>
where
Inner: AsApActor<ApInner>,
Inner: AsApActor,
{
fn ap_actor_ref(&self) -> &ApActor<ApInner> {
type Inner = Inner::Inner;
fn ap_actor_ref(&self) -> &ApActor<Self::Inner> {
self.inner.ap_actor_ref()
}
fn ap_actor_mut(&mut self) -> &mut ApActor<ApInner> {
fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner> {
self.inner.ap_actor_mut()
}
}

View file

@ -39,12 +39,14 @@ use self::kind::*;
/// Implementation trait for deriving ActivityPub Actor methods for a type
///
/// Any type implementing AsObject will automatically gain methods provided by ApActorExt
pub trait AsApActor<Inner>: markers::Actor {
pub trait AsApActor: markers::Actor {
type Inner;
/// Immutable borrow of `ApActor<Inner>`
fn ap_actor_ref(&self) -> &ApActor<Inner>;
fn ap_actor_ref(&self) -> &ApActor<Self::Inner>;
/// Mutable borrow of `ApActor<Inner>`
fn ap_actor_mut(&mut self) -> &mut ApActor<Inner>;
fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner>;
}
/// Helper methods for interacting with ActivityPub Actor types
@ -52,7 +54,7 @@ pub trait AsApActor<Inner>: markers::Actor {
/// This trait represents methods valid for any ActivityPub Actor.
///
/// Documentation for the fields related to these methods can be found on the `ApActor` struct
pub trait ApActorExt<Inner>: AsApActor<Inner> {
pub trait ApActorExt: AsApActor {
/// Fetch the inbox for the current actor
///
/// ```rust
@ -64,7 +66,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn inbox<'a>(&'a self) -> Result<&'a IriString, CheckError>
where
Inner: 'a,
Self::Inner: 'a,
Self: BaseExt,
{
let inbox = self.inbox_unchecked();
@ -82,7 +84,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn inbox_unchecked<'a>(&'a self) -> &'a IriString
where
Inner: 'a,
Self::Inner: 'a,
{
&self.ap_actor_ref().inbox
}
@ -98,7 +100,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn inbox_mut<'a>(&'a mut self) -> &'a mut IriString
where
Inner: 'a,
Self::Inner: 'a,
{
&mut self.ap_actor_mut().inbox
}
@ -131,7 +133,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn outbox<'a>(&'a self) -> Result<Option<&'a IriString>, CheckError>
where
Inner: 'a,
Self::Inner: 'a,
Self: BaseExt,
{
self.outbox_unchecked()
@ -150,7 +152,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn outbox_unchecked<'a>(&'a self) -> Option<&'a IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_ref().outbox.as_ref()
}
@ -168,7 +170,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn outbox_mut<'a>(&'a mut self) -> Option<&'a mut IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_mut().outbox.as_mut()
}
@ -238,7 +240,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn following<'a>(&'a self) -> Result<Option<&'a IriString>, CheckError>
where
Inner: 'a,
Self::Inner: 'a,
Self: BaseExt,
{
self.following_unchecked()
@ -259,7 +261,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn following_unchecked<'a>(&'a self) -> Option<&'a IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_ref().following.as_ref()
}
@ -277,7 +279,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn following_mut<'a>(&'a mut self) -> Option<&'a mut IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_mut().following.as_mut()
}
@ -347,7 +349,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn followers<'a>(&'a self) -> Result<Option<&'a IriString>, CheckError>
where
Inner: 'a,
Self::Inner: 'a,
Self: BaseExt,
{
self.followers_unchecked()
@ -368,7 +370,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn followers_unchecked<'a>(&'a self) -> Option<&'a IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_ref().followers.as_ref()
}
@ -386,7 +388,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn followers_mut<'a>(&'a mut self) -> Option<&'a mut IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_mut().followers.as_mut()
}
@ -456,7 +458,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn liked<'a>(&'a self) -> Result<Option<&'a IriString>, CheckError>
where
Inner: 'a,
Self::Inner: 'a,
Self: BaseExt,
{
self.liked_unchecked()
@ -477,7 +479,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn liked_unchecked<'a>(&'a self) -> Option<&'a IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_ref().liked.as_ref()
}
@ -495,7 +497,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn liked_mut<'a>(&'a mut self) -> Option<&'a mut IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_mut().liked.as_mut()
}
@ -565,7 +567,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn streams<'a>(&'a self) -> Result<Option<OneOrMany<&'a IriString>>, CheckError>
where
Inner: 'a,
Self::Inner: 'a,
Self: BaseExt,
{
if let Some(streams) = self.streams_unchecked() {
@ -592,7 +594,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn streams_unchecked<'a>(&'a self) -> Option<OneOrMany<&'a IriString>>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_ref().streams.as_ref().map(|o| o.as_ref())
}
@ -613,7 +615,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn streams_mut<'a>(&'a mut self) -> Option<OneOrMany<&'a mut IriString>>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_mut().streams.as_mut().map(|o| o.as_mut())
}
@ -734,7 +736,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn preferred_username<'a>(&'a self) -> Option<&'a str>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_ref().preferred_username.as_deref()
}
@ -813,7 +815,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
fn endpoints<'a>(&'a self) -> Result<Option<Endpoints<&'a IriString>>, CheckError>
where
Self: BaseExt,
Inner: 'a,
Self::Inner: 'a,
{
if let Some(endpoints) = self.endpoints_unchecked() {
let authority_opt = self.id_unchecked().and_then(|id| id.authority_components());
@ -868,7 +870,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn endpoints_unchecked<'a>(&'a self) -> Option<Endpoints<&'a IriString>>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_ref().endpoints.as_ref().map(|e| e.as_ref())
}
@ -889,7 +891,7 @@ pub trait ApActorExt<Inner>: AsApActor<Inner> {
/// ```
fn endpoints_mut<'a>(&'a mut self) -> Option<Endpoints<&'a mut IriString>>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_actor_mut().endpoints.as_mut().map(|e| e.as_mut())
}
@ -1473,28 +1475,32 @@ where
}
}
impl<Inner> AsApActor<Inner> for ApActor<Inner>
impl<Inner> AsApActor for ApActor<Inner>
where
Inner: markers::Actor,
{
fn ap_actor_ref(&self) -> &ApActor<Inner> {
type Inner = Inner;
fn ap_actor_ref(&self) -> &ApActor<Self::Inner> {
self
}
fn ap_actor_mut(&mut self) -> &mut ApActor<Inner> {
fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner> {
self
}
}
impl<Inner1, Inner2> AsApObject<Inner2> for ApActor<Inner1>
impl<Inner> AsApObject for ApActor<Inner>
where
Inner1: AsApObject<Inner2>,
Inner: AsApObject,
{
fn ap_object_ref(&self) -> &ApObject<Inner2> {
type Inner = Inner::Inner;
fn ap_object_ref(&self) -> &ApObject<Self::Inner> {
self.inner.ap_object_ref()
}
fn ap_object_mut(&mut self) -> &mut ApObject<Inner2> {
fn ap_object_mut(&mut self) -> &mut ApObject<Self::Inner> {
self.inner.ap_object_mut()
}
}
@ -1543,17 +1549,19 @@ impl<Kind> AsObject for Actor<Kind> {
}
}
impl<T, Inner> ApActorExt<Inner> for T where T: AsApActor<Inner> {}
impl<T> ApActorExt for T where T: AsApActor {}
impl<Inner1, Inner2> AsApActor<Inner2> for ApObject<Inner1>
impl<Inner> AsApActor for ApObject<Inner>
where
Inner1: AsApActor<Inner2>,
Inner: AsApActor,
{
fn ap_actor_ref(&self) -> &ApActor<Inner2> {
type Inner = Inner::Inner;
fn ap_actor_ref(&self) -> &ApActor<Self::Inner> {
self.inner().ap_actor_ref()
}
fn ap_actor_mut(&mut self) -> &mut ApActor<Inner2> {
fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner> {
self.inner_mut().ap_actor_mut()
}
}

View file

@ -49,12 +49,14 @@ pub trait AsObject: markers::Object {
/// Implementation trait for deriving ActivityPub Object methods for a type
///
/// Any type implementing AsApObject will automatically gain methods provided by ApObjectExt
pub trait AsApObject<Inner>: markers::Object {
pub trait AsApObject: markers::Object {
type Inner;
/// Immutable borrow of `ApObject<Inner>`
fn ap_object_ref(&self) -> &ApObject<Inner>;
fn ap_object_ref(&self) -> &ApObject<Self::Inner>;
/// Mutable borrow of `ApObject<Inner>`
fn ap_object_mut(&mut self) -> &mut ApObject<Inner>;
fn ap_object_mut(&mut self) -> &mut ApObject<Self::Inner>;
}
/// Implementation trait for deriving Place methods for a type
@ -2786,7 +2788,7 @@ pub trait ObjectExt: AsObject {
/// This trait represents methods valid for any ActivityPub Object.
///
/// Documentation for the fields related to these methods can be found on the `ApObject` struct
pub trait ApObjectExt<Inner>: AsApObject<Inner> {
pub trait ApObjectExt: AsApObject {
/// Fetch the shares for the current object
///
/// ```rust
@ -2801,7 +2803,7 @@ pub trait ApObjectExt<Inner>: AsApObject<Inner> {
/// ```
fn shares<'a>(&'a self) -> Option<&'a IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_object_ref().shares.as_ref()
}
@ -2874,7 +2876,7 @@ pub trait ApObjectExt<Inner>: AsApObject<Inner> {
/// ```
fn likes<'a>(&'a self) -> Option<&'a IriString>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_object_ref().likes.as_ref()
}
@ -2947,7 +2949,7 @@ pub trait ApObjectExt<Inner>: AsApObject<Inner> {
/// ```
fn source<'a>(&'a self) -> Option<&'a AnyBase>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_object_ref().source.as_ref()
}
@ -3023,7 +3025,7 @@ pub trait ApObjectExt<Inner>: AsApObject<Inner> {
/// ```
fn upload_media<'a>(&'a self) -> Option<OneOrMany<&'a IriString>>
where
Inner: 'a,
Self::Inner: 'a,
{
self.ap_object_ref()
.upload_media
@ -5364,7 +5366,7 @@ impl markers::Base for Tombstone {}
impl markers::Object for Tombstone {}
impl<T, Kind> ObjectExt for T where T: AsObject<Kind = Kind> {}
impl<T, Inner> ApObjectExt<Inner> for T where T: AsApObject<Inner> {}
impl<T> ApObjectExt for T where T: AsApObject {}
impl<T> PlaceExt for T where T: AsPlace {}
impl<T> ProfileExt for T where T: AsProfile {}
impl<T> RelationshipExt for T where T: AsRelationship {}
@ -5424,15 +5426,17 @@ where
}
}
impl<Inner> AsApObject<Inner> for ApObject<Inner>
impl<Inner> AsApObject for ApObject<Inner>
where
Inner: markers::Object,
{
fn ap_object_ref(&self) -> &ApObject<Inner> {
type Inner = Inner;
fn ap_object_ref(&self) -> &ApObject<Self::Inner> {
self
}
fn ap_object_mut(&mut self) -> &mut ApObject<Inner> {
fn ap_object_mut(&mut self) -> &mut ApObject<Self::Inner> {
self
}
}

View file

@ -126,15 +126,17 @@
//! ///
//! /// This allows us to access methods related to `inbox`, `outbox`, `following`, `followers`,
//! /// `liked`, `streams`, `endpoints`, and more directly from the PublicKey struct
//! impl<Inner1, Inner2> AsApActor<Inner2> for PublicKey<Inner1>
//! impl<Inner> AsApActor for PublicKey<Inner>
//! where
//! Inner1: AsApActor<Inner2>,
//! Inner: AsApActor,
//! {
//! fn ap_actor_ref(&self) -> &ApActor<Inner2> {
//! type Inner = Inner::Inner;
//!
//! fn ap_actor_ref(&self) -> &ApActor<Self::Inner> {
//! self.inner.ap_actor_ref()
//! }
//!
//! fn ap_actor_mut(&mut self) -> &mut ApActor<Inner2> {
//! fn ap_actor_mut(&mut self) -> &mut ApActor<Self::Inner> {
//! self.inner.ap_actor_mut()
//! }
//! }