Skip to content

Commit a57dc7e

Browse files
authored
Merge pull request #22 from alecmocatta/serialize-ref
More general Serialize impls on convenience traits
2 parents e372d94 + 1799a6c commit a57dc7e

File tree

5 files changed

+141
-49
lines changed

5 files changed

+141
-49
lines changed

Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "serde_traitobject"
3-
version = "0.2.1"
3+
version = "0.2.2"
44
license = "MIT OR Apache-2.0"
55
authors = ["Alec Mocatta <[email protected]>"]
66
categories = ["development-tools","encoding","rust-patterns","network-programming"]
@@ -12,7 +12,7 @@ This library enables the serialization and deserialization of trait objects such
1212
"""
1313
repository = "https://github.com/alecmocatta/serde_traitobject"
1414
homepage = "https://github.com/alecmocatta/serde_traitobject"
15-
documentation = "https://docs.rs/serde_traitobject/0.2.1"
15+
documentation = "https://docs.rs/serde_traitobject/0.2.2"
1616
readme = "README.md"
1717
edition = "2018"
1818

README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
[![MIT / Apache 2.0 licensed](https://img.shields.io/crates/l/serde_traitobject.svg?maxAge=2592000)](#License)
55
[![Build Status](https://dev.azure.com/alecmocatta/serde_traitobject/_apis/build/status/tests?branchName=master)](https://dev.azure.com/alecmocatta/serde_traitobject/_build/latest?branchName=master)
66

7-
[Docs](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/)
7+
[Docs](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/)
88

99
**Serializable and deserializable trait objects.**
1010

1111
This library enables the serialization and deserialization of trait objects so they can be sent between other processes running the same binary.
1212

1313
For example, if you have multiple forks of a process, or the same binary running on each of a cluster of machines, this library lets you send trait objects between them.
1414

15-
Any trait can be made (de)serializable when made into a trait object by adding this crate's [Serialize](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.Serialize.html) and [Deserialize](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.Deserialize.html) traits as supertraits:
15+
Any trait can be made (de)serializable when made into a trait object by adding this crate's [Serialize](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.Serialize.html) and [Deserialize](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.Deserialize.html) traits as supertraits:
1616

1717
```rust
1818
trait MyTrait: serde_traitobject::Serialize + serde_traitobject::Deserialize {
@@ -28,12 +28,12 @@ struct Message(#[serde(with = "serde_traitobject")] Box<dyn MyTrait>);
2828
And that's it! The two traits are automatically implemented for all `T: serde::Serialize` and all `T: serde::de::DeserializeOwned`, so as long as all implementors of your trait are themselves serializable then you're good to go.
2929

3030
There are two ways to (de)serialize your trait object:
31-
* Apply the `#[serde(with = "serde_traitobject")]` [field attribute](https://serde.rs/attributes.html), which instructs serde to use this crate's [serialize](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/fn.serialize.html) and [deserialize](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/fn.deserialize.html) functions;
32-
* The [Box](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/struct.Box.html), [Rc](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/struct.Rc.html) and [Arc](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/struct.Arc.html) structs, which are simple wrappers around their stdlib counterparts that automatically handle (de)serialization without needing the above annotation;
31+
* Apply the `#[serde(with = "serde_traitobject")]` [field attribute](https://serde.rs/attributes.html), which instructs serde to use this crate's [serialize](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/fn.serialize.html) and [deserialize](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/fn.deserialize.html) functions;
32+
* The [Box](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/struct.Box.html), [Rc](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/struct.Rc.html) and [Arc](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/struct.Arc.html) structs, which are simple wrappers around their stdlib counterparts that automatically handle (de)serialization without needing the above annotation;
3333

3434
Additionally, there are several convenience traits implemented that extend their stdlib counterparts:
3535

36-
* [Any](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.Any.html), [Debug](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.Debug.html), [Display](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.Display.html), [Error](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.Error.html), [Fn](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.Fn.html), [FnMut](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.FnMut.html), [FnOnce](https://docs.rs/serde_traitobject/0.2.1/serde_traitobject/trait.FnOnce.html)
36+
* [Any](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.Any.html), [Debug](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.Debug.html), [Display](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.Display.html), [Error](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.Error.html), [Fn](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.Fn.html), [FnMut](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.FnMut.html), [FnOnce](https://docs.rs/serde_traitobject/0.2.2/serde_traitobject/trait.FnOnce.html)
3737

3838
These are automatically implemented on all implementors of their stdlib counterparts that also implement `serde::Serialize` and `serde::de::DeserializeOwned`.
3939

src/convenience.rs

+105-34
Original file line numberDiff line numberDiff line change
@@ -415,12 +415,23 @@ where
415415
}
416416
}
417417

418-
impl serde::ser::Serialize for boxed::Box<dyn Any + 'static> {
418+
impl<'a> AsRef<Self> for dyn Any + 'a {
419+
fn as_ref(&self) -> &Self {
420+
self
421+
}
422+
}
423+
impl<'a> AsRef<Self> for dyn Any + Send + 'a {
424+
fn as_ref(&self) -> &Self {
425+
self
426+
}
427+
}
428+
429+
impl serde::ser::Serialize for dyn Any {
419430
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
420431
where
421432
S: serde::Serializer,
422433
{
423-
serialize(&self, serializer)
434+
serialize(self, serializer)
424435
}
425436
}
426437
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Any + 'static> {
@@ -431,12 +442,12 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Any + 'static> {
431442
<Box<dyn Any + 'static>>::deserialize(deserializer).map(|x| x.0)
432443
}
433444
}
434-
impl serde::ser::Serialize for boxed::Box<dyn Any + Send + 'static> {
445+
impl serde::ser::Serialize for dyn Any + Send {
435446
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
436447
where
437448
S: serde::Serializer,
438449
{
439-
serialize(&self, serializer)
450+
serialize(self, serializer)
440451
}
441452
}
442453
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Any + Send + 'static> {
@@ -484,6 +495,17 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Any + Send + 'static> {
484495
pub trait Error: error::Error + Serialize + Deserialize {}
485496
impl<T: ?Sized> Error for T where T: error::Error + Serialize + Deserialize {}
486497

498+
impl<'a> AsRef<Self> for dyn Error + 'a {
499+
fn as_ref(&self) -> &Self {
500+
self
501+
}
502+
}
503+
impl<'a> AsRef<Self> for dyn Error + Send + 'a {
504+
fn as_ref(&self) -> &Self {
505+
self
506+
}
507+
}
508+
487509
#[allow(clippy::use_self)]
488510
impl<'a, E: error::Error + Serialize + Deserialize + 'a> From<E> for Box<dyn Error + 'a> {
489511
fn from(err: E) -> Self {
@@ -497,12 +519,12 @@ impl<'a, E: error::Error + Serialize + Deserialize + 'a> From<E> for boxed::Box<
497519
}
498520
}
499521

500-
impl serde::ser::Serialize for boxed::Box<dyn Error + 'static> {
522+
impl serde::ser::Serialize for dyn Error {
501523
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
502524
where
503525
S: serde::Serializer,
504526
{
505-
serialize(&self, serializer)
527+
serialize(self, serializer)
506528
}
507529
}
508530
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Error + 'static> {
@@ -513,12 +535,12 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Error + 'static> {
513535
<Box<dyn Error + 'static>>::deserialize(deserializer).map(|x| x.0)
514536
}
515537
}
516-
impl serde::ser::Serialize for boxed::Box<dyn Error + Send + 'static> {
538+
impl serde::ser::Serialize for dyn Error + Send {
517539
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
518540
where
519541
S: serde::Serializer,
520542
{
521-
serialize(&self, serializer)
543+
serialize(self, serializer)
522544
}
523545
}
524546
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Error + Send + 'static> {
@@ -555,12 +577,23 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Error + Send + 'static>
555577
pub trait Display: fmt::Display + Serialize + Deserialize {}
556578
impl<T: ?Sized> Display for T where T: fmt::Display + Serialize + Deserialize {}
557579

558-
impl serde::ser::Serialize for boxed::Box<dyn Display + 'static> {
580+
impl<'a> AsRef<Self> for dyn Display + 'a {
581+
fn as_ref(&self) -> &Self {
582+
self
583+
}
584+
}
585+
impl<'a> AsRef<Self> for dyn Display + Send + 'a {
586+
fn as_ref(&self) -> &Self {
587+
self
588+
}
589+
}
590+
591+
impl serde::ser::Serialize for dyn Display {
559592
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
560593
where
561594
S: serde::Serializer,
562595
{
563-
serialize(&self, serializer)
596+
serialize(self, serializer)
564597
}
565598
}
566599
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Display + 'static> {
@@ -571,12 +604,12 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Display + 'static> {
571604
<Box<dyn Display + 'static>>::deserialize(deserializer).map(|x| x.0)
572605
}
573606
}
574-
impl serde::ser::Serialize for boxed::Box<dyn Display + Send + 'static> {
607+
impl serde::ser::Serialize for dyn Display + Send {
575608
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
576609
where
577610
S: serde::Serializer,
578611
{
579-
serialize(&self, serializer)
612+
serialize(self, serializer)
580613
}
581614
}
582615
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Display + Send + 'static> {
@@ -613,12 +646,23 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Display + Send + 'stati
613646
pub trait Debug: fmt::Debug + Serialize + Deserialize {}
614647
impl<T: ?Sized> Debug for T where T: fmt::Debug + Serialize + Deserialize {}
615648

616-
impl serde::ser::Serialize for boxed::Box<dyn Debug + 'static> {
649+
impl<'a> AsRef<Self> for dyn Debug + 'a {
650+
fn as_ref(&self) -> &Self {
651+
self
652+
}
653+
}
654+
impl<'a> AsRef<Self> for dyn Debug + Send + 'a {
655+
fn as_ref(&self) -> &Self {
656+
self
657+
}
658+
}
659+
660+
impl serde::ser::Serialize for dyn Debug {
617661
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
618662
where
619663
S: serde::Serializer,
620664
{
621-
serialize(&self, serializer)
665+
serialize(self, serializer)
622666
}
623667
}
624668
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Debug + 'static> {
@@ -629,12 +673,12 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Debug + 'static> {
629673
<Box<dyn Debug + 'static>>::deserialize(deserializer).map(|x| x.0)
630674
}
631675
}
632-
impl serde::ser::Serialize for boxed::Box<dyn Debug + Send + 'static> {
676+
impl serde::ser::Serialize for dyn Debug + Send {
633677
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
634678
where
635679
S: serde::Serializer,
636680
{
637-
serialize(&self, serializer)
681+
serialize(self, serializer)
638682
}
639683
}
640684
impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Debug + Send + 'static> {
@@ -652,14 +696,23 @@ impl<'de> serde::de::Deserialize<'de> for boxed::Box<dyn Debug + Send + 'static>
652696
pub trait FnOnce<Args>: ops::FnOnce<Args> + Serialize + Deserialize {}
653697
impl<T: ?Sized, Args> FnOnce<Args> for T where T: ops::FnOnce<Args> + Serialize + Deserialize {}
654698

655-
impl<Args: 'static, Output: 'static> serde::ser::Serialize
656-
for boxed::Box<dyn FnOnce<Args, Output = Output> + 'static>
657-
{
699+
impl<'a, Args, Output> AsRef<Self> for dyn FnOnce<Args, Output = Output> + 'a {
700+
fn as_ref(&self) -> &Self {
701+
self
702+
}
703+
}
704+
impl<'a, Args, Output> AsRef<Self> for dyn FnOnce<Args, Output = Output> + Send + 'a {
705+
fn as_ref(&self) -> &Self {
706+
self
707+
}
708+
}
709+
710+
impl<Args: 'static, Output: 'static> serde::ser::Serialize for dyn FnOnce<Args, Output = Output> {
658711
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
659712
where
660713
S: serde::Serializer,
661714
{
662-
serialize(&self, serializer)
715+
serialize(self, serializer)
663716
}
664717
}
665718
impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
@@ -673,13 +726,13 @@ impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
673726
}
674727
}
675728
impl<Args: 'static, Output: 'static> serde::ser::Serialize
676-
for boxed::Box<dyn FnOnce<Args, Output = Output> + Send + 'static>
729+
for dyn FnOnce<Args, Output = Output> + Send
677730
{
678731
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
679732
where
680733
S: serde::Serializer,
681734
{
682-
serialize(&self, serializer)
735+
serialize(self, serializer)
683736
}
684737
}
685738
impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
@@ -700,14 +753,23 @@ impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
700753
pub trait FnMut<Args>: ops::FnMut<Args> + Serialize + Deserialize {}
701754
impl<T: ?Sized, Args> FnMut<Args> for T where T: ops::FnMut<Args> + Serialize + Deserialize {}
702755

703-
impl<Args: 'static, Output: 'static> serde::ser::Serialize
704-
for boxed::Box<dyn FnMut<Args, Output = Output> + 'static>
705-
{
756+
impl<'a, Args, Output> AsRef<Self> for dyn FnMut<Args, Output = Output> + 'a {
757+
fn as_ref(&self) -> &Self {
758+
self
759+
}
760+
}
761+
impl<'a, Args, Output> AsRef<Self> for dyn FnMut<Args, Output = Output> + Send + 'a {
762+
fn as_ref(&self) -> &Self {
763+
self
764+
}
765+
}
766+
767+
impl<Args: 'static, Output: 'static> serde::ser::Serialize for dyn FnMut<Args, Output = Output> {
706768
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
707769
where
708770
S: serde::Serializer,
709771
{
710-
serialize(&self, serializer)
772+
serialize(self, serializer)
711773
}
712774
}
713775
impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
@@ -721,13 +783,13 @@ impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
721783
}
722784
}
723785
impl<Args: 'static, Output: 'static> serde::ser::Serialize
724-
for boxed::Box<dyn FnMut<Args, Output = Output> + Send + 'static>
786+
for dyn FnMut<Args, Output = Output> + Send
725787
{
726788
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
727789
where
728790
S: serde::Serializer,
729791
{
730-
serialize(&self, serializer)
792+
serialize(self, serializer)
731793
}
732794
}
733795
impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
@@ -748,14 +810,23 @@ impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
748810
pub trait Fn<Args>: ops::Fn<Args> + Serialize + Deserialize {}
749811
impl<T: ?Sized, Args> Fn<Args> for T where T: ops::Fn<Args> + Serialize + Deserialize {}
750812

751-
impl<Args: 'static, Output: 'static> serde::ser::Serialize
752-
for boxed::Box<dyn Fn<Args, Output = Output> + 'static>
753-
{
813+
impl<'a, Args, Output> AsRef<Self> for dyn Fn<Args, Output = Output> + 'a {
814+
fn as_ref(&self) -> &Self {
815+
self
816+
}
817+
}
818+
impl<'a, Args, Output> AsRef<Self> for dyn Fn<Args, Output = Output> + Send + 'a {
819+
fn as_ref(&self) -> &Self {
820+
self
821+
}
822+
}
823+
824+
impl<Args: 'static, Output: 'static> serde::ser::Serialize for dyn Fn<Args, Output = Output> {
754825
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
755826
where
756827
S: serde::Serializer,
757828
{
758-
serialize(&self, serializer)
829+
serialize(self, serializer)
759830
}
760831
}
761832
impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
@@ -769,13 +840,13 @@ impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
769840
}
770841
}
771842
impl<Args: 'static, Output: 'static> serde::ser::Serialize
772-
for boxed::Box<dyn Fn<Args, Output = Output> + Send + 'static>
843+
for dyn Fn<Args, Output = Output> + Send
773844
{
774845
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
775846
where
776847
S: serde::Serializer,
777848
{
778-
serialize(&self, serializer)
849+
serialize(self, serializer)
779850
}
780851
}
781852
impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
//!
9595
//! This crate currently requires Rust nightly.
9696
97-
#![doc(html_root_url = "https://docs.rs/serde_traitobject/0.2.1")]
97+
#![doc(html_root_url = "https://docs.rs/serde_traitobject/0.2.2")]
9898
#![feature(
9999
arbitrary_self_types,
100100
coerce_unsized,

0 commit comments

Comments
 (0)