Skip to content

Commit 3a739ec

Browse files
authored
Merge pull request #28 from alecmocatta/fix-nightly
Fix on latest nightly
2 parents aa553ab + 9dec91f commit 3a739ec

File tree

6 files changed

+72
-132
lines changed

6 files changed

+72
-132
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.5"
3+
version = "0.2.6"
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.5"
15+
documentation = "https://docs.rs/serde_traitobject/0.2.6"
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?definitionId=9)
66

7-
[📖 Docs](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/) | [💬 Chat](https://constellation.zulipchat.com/#narrow/stream/213236-subprojects)
7+
[📖 Docs](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/) | [💬 Chat](https://constellation.zulipchat.com/#narrow/stream/213236-subprojects)
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.5/serde_traitobject/trait.Serialize.html) and [Deserialize](https://docs.rs/serde_traitobject/0.2.5/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.6/serde_traitobject/trait.Serialize.html) and [Deserialize](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.Deserialize.html) traits as supertraits:
1616

1717
```rust
1818
trait MyTrait: serde_traitobject::Serialize + serde_traitobject::Deserialize {
@@ -31,12 +31,12 @@ struct Message {
3131
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.
3232

3333
There are two ways to (de)serialize your trait object:
34-
* 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.5/serde_traitobject/fn.serialize.html) and [deserialize](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/fn.deserialize.html) functions;
35-
* The [Box](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/struct.Box.html), [Rc](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/struct.Rc.html) and [Arc](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/struct.Arc.html) structs, which are simple wrappers around their stdlib counterparts that automatically handle (de)serialization without needing the above annotation;
34+
* 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.6/serde_traitobject/fn.serialize.html) and [deserialize](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/fn.deserialize.html) functions;
35+
* The [Box](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/struct.Box.html), [Rc](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/struct.Rc.html) and [Arc](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/struct.Arc.html) structs, which are simple wrappers around their stdlib counterparts that automatically handle (de)serialization without needing the above annotation;
3636

3737
Additionally, there are several convenience traits implemented that extend their stdlib counterparts:
3838

39-
* [Any](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/trait.Any.html), [Debug](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/trait.Debug.html), [Display](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/trait.Display.html), [Error](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/trait.Error.html), [Fn](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/trait.Fn.html), [FnMut](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/trait.FnMut.html), [FnOnce](https://docs.rs/serde_traitobject/0.2.5/serde_traitobject/trait.FnOnce.html)
39+
* [Any](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.Any.html), [Debug](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.Debug.html), [Display](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.Display.html), [Error](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.Error.html), [Fn](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.Fn.html), [FnMut](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.FnMut.html), [FnOnce](https://docs.rs/serde_traitobject/0.2.6/serde_traitobject/trait.FnOnce.html)
4040

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

azure-pipelines.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
endpoint: alecmocatta
1515
default:
1616
rust_toolchain: nightly
17-
rust_lint_toolchain: nightly-2020-06-10
17+
rust_lint_toolchain: nightly-2020-06-25
1818
rust_flags: ''
1919
rust_features: ''
2020
rust_target_check: ''

src/convenience.rs

-54
Original file line numberDiff line numberDiff line change
@@ -704,16 +704,6 @@ impl<'a, Args, Output> AsRef<Self> for dyn FnOnce<Args, Output = Output> + Send
704704
self
705705
}
706706
}
707-
impl<'a, A, Output> AsRef<Self> for dyn for<'r> FnOnce<(&'r A,), Output = Output> + 'a {
708-
fn as_ref(&self) -> &Self {
709-
self
710-
}
711-
}
712-
impl<'a, A, Output> AsRef<Self> for dyn for<'r> FnOnce<(&'r A,), Output = Output> + Send + 'a {
713-
fn as_ref(&self) -> &Self {
714-
self
715-
}
716-
}
717707

718708
impl<Args: 'static, Output: 'static> serde::ser::Serialize for dyn FnOnce<Args, Output = Output> {
719709
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
@@ -754,50 +744,6 @@ impl<'de, Args: 'static, Output: 'static> serde::de::Deserialize<'de>
754744
.map(|x| x.0)
755745
}
756746
}
757-
impl<A: 'static, Output: 'static> serde::ser::Serialize
758-
for dyn for<'r> FnOnce<(&'r A,), Output = Output>
759-
{
760-
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
761-
where
762-
S: serde::Serializer,
763-
{
764-
serialize(self, serializer)
765-
}
766-
}
767-
impl<'de, A: 'static, Output: 'static> serde::de::Deserialize<'de>
768-
for boxed::Box<dyn for<'r> FnOnce<(&'r A,), Output = Output> + 'static>
769-
{
770-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
771-
where
772-
D: serde::Deserializer<'de>,
773-
{
774-
<Box<dyn for<'r> FnOnce<(&'r A,), Output = Output> + 'static>>::deserialize(deserializer)
775-
.map(|x| x.0)
776-
}
777-
}
778-
impl<A: 'static, Output: 'static> serde::ser::Serialize
779-
for dyn for<'r> FnOnce<(&'r A,), Output = Output> + Send
780-
{
781-
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
782-
where
783-
S: serde::Serializer,
784-
{
785-
serialize(self, serializer)
786-
}
787-
}
788-
impl<'de, A: 'static, Output: 'static> serde::de::Deserialize<'de>
789-
for boxed::Box<dyn for<'r> FnOnce<(&'r A,), Output = Output> + Send + 'static>
790-
{
791-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
792-
where
793-
D: serde::Deserializer<'de>,
794-
{
795-
<Box<dyn for<'r> FnOnce<(&'r A,), Output = Output> + Send + 'static>>::deserialize(
796-
deserializer,
797-
)
798-
.map(|x| x.0)
799-
}
800-
}
801747

802748
/// A convenience trait implemented on all (de)serializable implementors of [`std::ops::FnMut`].
803749
///

src/lib.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@
9999
//!
100100
//! This crate currently requires Rust nightly.
101101
102-
#![doc(html_root_url = "https://docs.rs/serde_traitobject/0.2.5")]
102+
#![doc(html_root_url = "https://docs.rs/serde_traitobject/0.2.6")]
103103
#![feature(
104104
arbitrary_self_types,
105105
coerce_unsized,
@@ -119,10 +119,11 @@
119119
unused_results,
120120
clippy::pedantic
121121
)] // from https://github.com/rust-unofficial/patterns/blob/master/anti_patterns/deny-warnings.md
122-
#![allow(clippy::must_use_candidate, clippy::missing_errors_doc)]
123-
// At some point this, and the HRTB Fn* impls, will be invalid
124-
// See https://github.com/rust-lang/rust/issues/56105
125-
#![allow(coherence_leak_check)]
122+
#![allow(
123+
clippy::must_use_candidate,
124+
clippy::missing_errors_doc,
125+
incomplete_features
126+
)]
126127

127128
mod convenience;
128129

tests/test.rs

+58-65
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,44 @@
1010
unused_results,
1111
clippy::pedantic
1212
)] // from https://github.com/rust-unofficial/patterns/blob/master/anti_patterns/deny-warnings.md
13-
#![allow(clippy::unseparated_literal_suffix)]
13+
#![allow(clippy::unseparated_literal_suffix, dead_code)]
1414

1515
use serde_closure::Fn;
1616
use serde_derive::{Deserialize, Serialize};
17+
use serde_traitobject as st;
1718
use serde_traitobject::{Deserialize, Serialize};
1819
use std::{any, env, process, rc};
1920
use wasm_bindgen_test::wasm_bindgen_test;
2021

2122
#[derive(Serialize, Deserialize)]
2223
struct Abc {
23-
#[serde(with = "serde_traitobject")]
24+
#[serde(with = "st")]
2425
a: rc::Rc<dyn HelloSerialize>,
25-
b: serde_traitobject::Rc<dyn HelloSerialize>,
26-
#[serde(with = "serde_traitobject")]
26+
b: st::Rc<dyn HelloSerialize>,
27+
#[serde(with = "st")]
2728
c: Box<dyn HelloSerialize>,
28-
d: serde_traitobject::Box<dyn HelloSerialize>,
29-
#[serde(with = "serde_traitobject")]
30-
e: Box<dyn serde_traitobject::Any>,
31-
f: serde_traitobject::Box<dyn serde_traitobject::Any>,
32-
g: serde_traitobject::Box<dyn serde_traitobject::Fn(usize) -> String>,
33-
h: serde_traitobject::Box<dyn serde_traitobject::Any>,
34-
i: serde_traitobject::Box<dyn serde_traitobject::Any>,
35-
j: serde_traitobject::Box<String>,
36-
#[serde(with = "serde_traitobject")]
29+
d: st::Box<dyn HelloSerialize>,
30+
#[serde(with = "st")]
31+
e: Box<dyn st::Any>,
32+
f: st::Box<dyn st::Any>,
33+
g: st::Box<dyn st::Fn(usize) -> String>,
34+
h: st::Box<dyn st::Any>,
35+
i: st::Box<dyn st::Any>,
36+
j: st::Box<String>,
37+
#[serde(with = "st")]
3738
k: Box<String>,
38-
l: serde_traitobject::Box<str>,
39-
#[serde(with = "serde_traitobject")]
39+
l: st::Box<str>,
40+
#[serde(with = "st")]
4041
m: Box<str>,
41-
n: serde_traitobject::Box<[u16]>,
42-
#[serde(with = "serde_traitobject")]
42+
n: st::Box<[u16]>,
43+
#[serde(with = "st")]
4344
o: Box<[u16]>,
4445
}
4546

4647
#[derive(Serialize)]
4748
struct Def<'a> {
48-
a: &'a (dyn serde_traitobject::FnOnce<(), Output = ()> + 'static),
49-
c: &'a mut (dyn serde_traitobject::FnOnce<(), Output = ()> + 'static),
49+
a: &'a (dyn st::FnOnce<(), Output = ()> + 'static),
50+
c: &'a mut (dyn st::FnOnce<(), Output = ()> + 'static),
5051
}
5152

5253
trait Hello {
@@ -76,7 +77,7 @@ impl Hello for u8 {
7677

7778
#[derive(Serialize)]
7879
struct Ghi<'a> {
79-
#[serde(with = "serde_traitobject")]
80+
#[serde(with = "st")]
8081
e: &'a (dyn Hello2Serialize + 'static),
8182
}
8283
trait Hello2 {}
@@ -88,6 +89,17 @@ impl<'a> AsRef<dyn Hello2Serialize + 'a> for dyn Hello2Serialize {
8889
}
8990
}
9091

92+
type Request = st::Box<dyn for<'a> st::FnOnce<(&'a String,), Output = ()> + Send>;
93+
94+
fn _assert() {
95+
fn assert_serializable<T>()
96+
where
97+
T: serde::Serialize + for<'de> serde::Deserialize<'de>,
98+
{
99+
}
100+
assert_serializable::<Request>();
101+
}
102+
91103
#[wasm_bindgen_test]
92104
#[allow(clippy::too_many_lines)]
93105
fn main() {
@@ -122,17 +134,14 @@ fn main() {
122134
);
123135
assert_eq!(g(22), "hey 123!");
124136
assert_eq!(
125-
***Box::<dyn any::Any>::downcast::<serde_traitobject::Box<usize>>(h.into_any())
126-
.unwrap(),
137+
***Box::<dyn any::Any>::downcast::<st::Box<usize>>(h.into_any()).unwrap(),
127138
987_654_321
128139
);
129140
assert_eq!(
130141
*Box::<dyn any::Any>::downcast::<usize>(
131-
Box::<dyn any::Any>::downcast::<serde_traitobject::Box<dyn serde_traitobject::Any>>(
132-
i.into_any()
133-
)
134-
.unwrap()
135-
.into_any()
142+
Box::<dyn any::Any>::downcast::<st::Box<dyn st::Any>>(i.into_any())
143+
.unwrap()
144+
.into_any()
136145
)
137146
.unwrap(),
138147
987_654_321
@@ -151,28 +160,24 @@ fn main() {
151160
let a: Box<dyn any::Any> = *a;
152161
let _: Box<usize> = Box::<dyn any::Any>::downcast(a).unwrap();
153162

154-
let a: serde_traitobject::Box<dyn serde_traitobject::Any> =
155-
serde_traitobject::Box::new(serde_traitobject::Box::new(1usize)
156-
as serde_traitobject::Box<dyn serde_traitobject::Any>);
163+
let a: st::Box<dyn st::Any> = st::Box::new(st::Box::new(1usize) as st::Box<dyn st::Any>);
157164
let a: Box<dyn any::Any> = a.into_any();
158-
let a: Box<serde_traitobject::Box<dyn serde_traitobject::Any>> =
159-
Box::<dyn any::Any>::downcast(a).unwrap();
160-
let a: serde_traitobject::Box<dyn serde_traitobject::Any> = *a;
165+
let a: Box<st::Box<dyn st::Any>> = Box::<dyn any::Any>::downcast(a).unwrap();
166+
let a: st::Box<dyn st::Any> = *a;
161167
let a: Box<dyn any::Any> = a.into_any();
162168
let _: Box<usize> = Box::<dyn any::Any>::downcast(a).unwrap();
163169

164170
let original = Abc {
165171
a: rc::Rc::new(123u16),
166-
b: serde_traitobject::Rc::new(456u16),
172+
b: st::Rc::new(456u16),
167173
c: Box::new(789u32),
168-
d: serde_traitobject::Box::new(101u8),
174+
d: st::Box::new(101u8),
169175
e: Box::new(78u8),
170-
f: serde_traitobject::Box::new(78u8),
171-
g: serde_traitobject::Box::new(Fn!(|a: usize| format!("hey {}!", a + 101))),
172-
h: serde_traitobject::Box::new(serde_traitobject::Box::new(987_654_321usize)),
173-
i: serde_traitobject::Box::new(serde_traitobject::Box::new(987_654_321usize)
174-
as serde_traitobject::Box<dyn serde_traitobject::Any>),
175-
j: serde_traitobject::Box::new(String::from("abc")),
176+
f: st::Box::new(78u8),
177+
g: st::Box::new(Fn!(|a: usize| format!("hey {}!", a + 101))),
178+
h: st::Box::new(st::Box::new(987_654_321usize)),
179+
i: st::Box::new(st::Box::new(987_654_321usize) as st::Box<dyn st::Any>),
180+
j: st::Box::new(String::from("abc")),
176181
k: Box::new(String::from("def")),
177182
l: Into::<Box<str>>::into(String::from("ghi")).into(),
178183
m: String::from("jkl").into(),
@@ -185,39 +190,27 @@ fn main() {
185190
let a2 = bincode::deserialize(&a2).unwrap();
186191
test(a1);
187192
test(a2);
188-
let a1 = serde_json::to_string(
189-
&(serde_traitobject::Box::new(78u8)
190-
as serde_traitobject::Box<dyn serde_traitobject::Debug>),
191-
)
192-
.unwrap();
193-
let a1r: Result<serde_traitobject::Box<dyn serde_traitobject::Debug>, _> =
194-
serde_json::from_str(&a1);
193+
let a1 = serde_json::to_string(&(st::Box::new(78u8) as st::Box<dyn st::Debug>)).unwrap();
194+
let a1r: Result<st::Box<dyn st::Debug>, _> = serde_json::from_str(&a1);
195195
assert!(a1r.is_ok());
196-
let a1r: Result<serde_traitobject::Box<dyn serde_traitobject::Any>, _> =
197-
serde_json::from_str(&a1);
196+
let a1r: Result<st::Box<dyn st::Any>, _> = serde_json::from_str(&a1);
198197
assert!(a1r.is_err());
199-
let a1 = bincode::serialize(
200-
&(serde_traitobject::Box::new(78u8)
201-
as serde_traitobject::Box<dyn serde_traitobject::Debug>),
202-
)
203-
.unwrap();
204-
let a1: Result<serde_traitobject::Box<dyn serde_traitobject::Any>, _> =
205-
bincode::deserialize(&a1);
198+
let a1 = bincode::serialize(&(st::Box::new(78u8) as st::Box<dyn st::Debug>)).unwrap();
199+
let a1: Result<st::Box<dyn st::Any>, _> = bincode::deserialize(&a1);
206200
assert!(a1.is_err());
207201
}
208202

209203
let original = Abc {
210204
a: rc::Rc::new(123u16),
211-
b: serde_traitobject::Rc::new(456u16),
205+
b: st::Rc::new(456u16),
212206
c: Box::new(789u32),
213-
d: serde_traitobject::Box::new(101u8),
207+
d: st::Box::new(101u8),
214208
e: Box::new(78u8),
215-
f: serde_traitobject::Box::new(78u8),
216-
g: serde_traitobject::Box::new(Fn!(|a: usize| format!("hey {}!", a + 101))),
217-
h: serde_traitobject::Box::new(serde_traitobject::Box::new(987_654_321usize)),
218-
i: serde_traitobject::Box::new(serde_traitobject::Box::new(987_654_321usize)
219-
as serde_traitobject::Box<dyn serde_traitobject::Any>),
220-
j: serde_traitobject::Box::new(String::from("abc")),
209+
f: st::Box::new(78u8),
210+
g: st::Box::new(Fn!(|a: usize| format!("hey {}!", a + 101))),
211+
h: st::Box::new(st::Box::new(987_654_321usize)),
212+
i: st::Box::new(st::Box::new(987_654_321usize) as st::Box<dyn st::Any>),
213+
j: st::Box::new(String::from("abc")),
221214
k: Box::new(String::from("def")),
222215
l: Into::<Box<str>>::into(String::from("ghi")).into(),
223216
m: String::from("jkl").into(),

0 commit comments

Comments
 (0)