Perform type magic for recursive AsRef on Ext types

This commit is contained in:
asonix 2020-04-04 17:08:58 -05:00
parent 4ab09044ab
commit 8305cd8116
8 changed files with 32 additions and 52 deletions

View file

@ -1,7 +1,7 @@
[package] [package]
name = "activitystreams" name = "activitystreams"
description = "Activity Streams in Rust" description = "Activity Streams in Rust"
version = "0.5.0-alpha.16" version = "0.5.0-alpha.17"
license = "GPL-3.0" license = "GPL-3.0"
authors = ["asonix <asonix@asonix.dog>"] authors = ["asonix <asonix@asonix.dog>"]
repository = "https://git.asonix.dog/Aardwolf/activitystreams" repository = "https://git.asonix.dog/Aardwolf/activitystreams"
@ -17,7 +17,7 @@ primitives = ["chrono", "mime", "serde", "thiserror", "url"]
types = ["derive", "kinds", "primitives"] types = ["derive", "kinds", "primitives"]
[dependencies] [dependencies]
activitystreams-derive = { version = "0.5.0-alpha.8", path = "activitystreams-derive", optional = true} activitystreams-derive = { version = "0.5.0-alpha.9", path = "activitystreams-derive", optional = true}
chrono = { version = "0.4", optional = true } chrono = { version = "0.4", optional = true }
mime = { version = "0.3", optional = true } mime = { version = "0.3", optional = true }
serde = { version = "1.0", features = ["derive"], optional = true } serde = { version = "1.0", features = ["derive"], optional = true }

View file

@ -9,7 +9,7 @@ __A set of Traits and Types that make up the ActivityStreams and ActivityPub spe
First, add ActivityStreams to your dependencies First, add ActivityStreams to your dependencies
```toml ```toml
activitystreams = "0.5.0-alpha.16" activitystreams = "0.5.0-alpha.17"
``` ```
### Types ### Types
@ -177,7 +177,7 @@ There are a number of features that can be disabled in this crate. By default, e
enabled. enabled.
```toml ```toml
activitystreams = { version = "0.5.0-alpha.16", default-features = "false", features = ["derive"] } activitystreams = { version = "0.5.0-alpha.17", default-features = "false", features = ["derive"] }
``` ```
| feature | what you get | | feature | what you get |

View file

@ -1,7 +1,7 @@
[package] [package]
name = "activitystreams-derive" name = "activitystreams-derive"
description = "Derive macros for activitystreams" description = "Derive macros for activitystreams"
version = "0.5.0-alpha.8" version = "0.5.0-alpha.9"
license = "GPL-3.0" license = "GPL-3.0"
authors = ["asonix <asonix.dev@gmail.com>"] authors = ["asonix <asonix.dev@gmail.com>"]
repository = "https://git.asonix.dog/Aardwolf/activitystreams" repository = "https://git.asonix.dog/Aardwolf/activitystreams"

View file

@ -10,7 +10,7 @@ Add the required crates to your `Cargo.toml`
```toml ```toml
# Cargo.toml # Cargo.toml
activitystreams = "0.5.0-alpha.16" activitystreams = "0.5.0-alpha.17"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
``` ```

View file

@ -23,8 +23,8 @@
//! //!
//! First, add `serde` and `activitystreams-derive` to your Cargo.toml //! First, add `serde` and `activitystreams-derive` to your Cargo.toml
//! ```toml //! ```toml
//! activitystreams-derive = "0.5.0-alpha.8" //! activitystreams-derive = "0.5.0-alpha.9"
//! # or activitystreams = "0.5.0-alpha.16" //! # or activitystreams = "0.5.0-alpha.17"
//! serde = { version = "1.0", features = ["derive"] } //! serde = { version = "1.0", features = ["derive"] }
//! ``` //! ```
//! //!
@ -269,49 +269,11 @@ pub fn ref_derive(input: TokenStream) -> TokenStream {
} }
} }
impl<U> AsRef<#ty> for Ext<#name, U>
where
U: std::fmt::Debug,
{
fn as_ref(&self) -> &#ty {
self.base.as_ref()
}
}
impl<U, V> AsRef<#ty> for Ext<Ext<#name, U>, V>
where
U: std::fmt::Debug,
V: std::fmt::Debug,
{
fn as_ref(&self) -> &#ty {
self.base.as_ref()
}
}
impl AsMut<#ty> for #name { impl AsMut<#ty> for #name {
fn as_mut(&mut self) -> &mut #ty { fn as_mut(&mut self) -> &mut #ty {
&mut self.#ident &mut self.#ident
} }
} }
impl<U> AsMut<#ty> for Ext<#name, U>
where
U: std::fmt::Debug,
{
fn as_mut(&mut self) -> &mut #ty {
self.base.as_mut()
}
}
impl<U, V> AsMut<#ty> for Ext<Ext<#name, U>, V>
where
U: std::fmt::Debug,
V: std::fmt::Debug,
{
fn as_mut(&mut self) -> &mut #ty {
self.base.as_mut()
}
}
} }
}) })
.collect(); .collect();

View file

@ -126,10 +126,9 @@ use std::{convert::TryFrom, fmt::Debug};
/// For example, the type `Ext<Video, HashMap<String, String>>` will implement the `Object` trait, /// For example, the type `Ext<Video, HashMap<String, String>>` will implement the `Object` trait,
/// because `Video` implements that trait. /// because `Video` implements that trait.
/// ///
/// Additionally, some level of AsRef and AsMut have been derived for Ext. If type type /// Additionally, AsRef and AsMut have been implemented for Ext. If type type
/// `Ext<Ext<Follow, SomeTime>, AnotherType>` exists, that will implement /// `Ext<Ext<Follow, SomeTime>, AnotherType>` exists, that will implement
/// `AsRef<ActivityProperties>` just like the innermost `Follow`. This only works for types /// `AsRef<ActivityProperties>` just like the innermost `Follow`.
/// two levels deep, however.
/// ///
/// Usage: /// Usage:
/// ```rust /// ```rust
@ -204,6 +203,26 @@ pub trait Extensible<U> {
Self: Sized; Self: Sized;
} }
impl<T, U, V> AsRef<V> for Ext<T, U>
where
T: Base + AsRef<V>,
U: Extension<T> + Debug,
{
fn as_ref(&self) -> &V {
self.base.as_ref()
}
}
impl<T, U, V> AsMut<V> for Ext<T, U>
where
T: Base + AsMut<V>,
U: Extension<T> + Debug,
{
fn as_mut(&mut self) -> &mut V {
self.base.as_mut()
}
}
impl<T, U> TryFrom<Ext<T, U>> for BaseBox impl<T, U> TryFrom<Ext<T, U>> for BaseBox
where where
T: Base + serde::ser::Serialize, T: Base + serde::ser::Serialize,

View file

@ -25,7 +25,7 @@
//! //!
//! First, add ActivityStreams to your dependencies //! First, add ActivityStreams to your dependencies
//! ```toml //! ```toml
//! activitystreams = "0.5.0-alpha.16" //! activitystreams = "0.5.0-alpha.17"
//! ``` //! ```
//! //!
//! ### Types //! ### Types
@ -209,7 +209,7 @@
//! enabled. //! enabled.
//! //!
//! ```toml //! ```toml
//! activitystreams = { version = "0.5.0-alpha.16", default-features = "false", features = ["derive"] } //! activitystreams = { version = "0.5.0-alpha.17", default-features = "false", features = ["derive"] }
//! ``` //! ```
//! //!
//! | feature | what you get | //! | feature | what you get |

View file

@ -18,7 +18,6 @@
*/ */
use crate::{ use crate::{
ext::Ext,
link::{kind::*, properties::*, Link, LinkBox}, link::{kind::*, properties::*, Link, LinkBox},
Base, BaseBox, PropRefs, Base, BaseBox, PropRefs,
}; };