Skip to content

Commit bfb2549

Browse files
authored
Merge pull request #30 from alecmocatta/v0.3.0
Stable by default
2 parents 02c3cc2 + 5b93058 commit bfb2549

File tree

6 files changed

+119
-67
lines changed

6 files changed

+119
-67
lines changed

Cargo.toml

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[package]
44
name = "serde_closure"
5-
version = "0.2.14"
5+
version = "0.3.0"
66
license = "MIT OR Apache-2.0"
77
authors = ["Alec Mocatta <[email protected]>"]
88
categories = ["development-tools","encoding","rust-patterns","network-programming"]
@@ -23,11 +23,13 @@ azure-devops = { project = "alecmocatta/serde_closure", pipeline = "tests", buil
2323
maintenance = { status = "actively-developed" }
2424

2525
[features]
26-
default = ["nightly"]
2726
nightly = []
2827

28+
[package.metadata.docs.rs]
29+
features = ["nightly"]
30+
2931
[dependencies]
30-
serde_closure_derive = { version = "=0.2.14", path = "serde_closure_derive" }
32+
serde_closure_derive = { version = "=0.3.0", path = "serde_closure_derive" }
3133
serde = { version = "1.0", features = ["derive"] }
3234

3335
[dev-dependencies]

README.md

+17-6
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ This library provides macros that wrap closures to make them serializable and
1212
debuggable.
1313

1414
```rust
15+
use serde_closure::{traits::Fn, Fn};
16+
1517
let one = 1;
1618
let plus_one = Fn!(|x: i32| x + one);
1719

18-
assert_eq!(2, plus_one(1));
20+
assert_eq!(2, plus_one.call((1,))); // this works on stable and nightly
21+
// assert_eq!(2, plus_one(1)); // this only works on nightly
1922
println!("{:#?}", plus_one);
2023

2124
// prints:
@@ -25,14 +28,22 @@ println!("{:#?}", plus_one);
2528
// }
2629
```
2730

28-
This library aims to work in as simple and safe a way as possible. It currently
29-
requires nightly Rust for the `unboxed_closures` and `fn_traits` features (rust
31+
This library aims to work in as simple and safe a way as possible. On stable
32+
Rust the wrapped closures implement
33+
[`traits::FnOnce`](https://docs.rs/serde_closure/0.3/serde_closure/traits/trait.FnOnce.html),
34+
[`traits::FnMut`](https://docs.rs/serde_closure/0.3/serde_closure/traits/trait.FnMut.html)
35+
and [`traits::Fn`](https://docs.rs/serde_closure/0.3/serde_closure/traits/trait.Fn.html),
36+
and when the "nightly" feature is passed
37+
[`std::ops::FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html),
38+
[`std::ops::FnMut`](https://doc.rust-lang.org/std/ops/trait.FnMut.html) and
39+
[`std::ops::Fn`](https://doc.rust-lang.org/std/ops/trait.Fn.html) are
40+
implemented as well using the `unboxed_closures` and `fn_traits` features (rust
3041
issue [#29625](https://github.com/rust-lang/rust/issues/29625)).
3142

3243
* There are three macros,
33-
[`FnOnce`](https://docs.rs/serde_closure/0.2/serde_closure/macro.FnOnce.html),
34-
[`FnMut`](https://docs.rs/serde_closure/0.2/serde_closure/macro.FnMut.html)
35-
and [`Fn`](https://docs.rs/serde_closure/0.2/serde_closure/macro.Fn.html),
44+
[`FnOnce`](https://docs.rs/serde_closure/0.3/serde_closure/macro.FnOnce.html),
45+
[`FnMut`](https://docs.rs/serde_closure/0.3/serde_closure/macro.FnMut.html)
46+
and [`Fn`](https://docs.rs/serde_closure/0.3/serde_closure/macro.Fn.html),
3647
corresponding to the three types of Rust closure.
3748
* Wrap your closure with one of the macros and it will now implement `Copy`,
3849
`Clone`, `PartialEq`, `Eq`, `Hash`, `PartialOrd`, `Ord`, `Serialize`,

serde_closure_derive/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "serde_closure_derive"
3-
version = "0.2.14"
3+
version = "0.3.0"
44
license = "MIT OR Apache-2.0"
55
authors = ["Alec Mocatta <[email protected]>"]
66
categories = ["development-tools","encoding","rust-patterns","network-programming"]
@@ -25,6 +25,6 @@ maintenance = { status = "actively-developed" }
2525
proc-macro = true
2626

2727
[dependencies]
28-
proc-macro2 = { version = "1.0.1", default-features = false, features = ["span-locations"] }
28+
proc-macro2 = { version = "1.0.1", default-features = false }
2929
quote = { version = "1.0.2", default-features = false }
3030
syn = { version = "1.0.5", default-features = false, features = ["clone-impls", "full", "parsing", "printing", "proc-macro", "visit-mut"] }

serde_closure_derive/src/lib.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//! See [`serde_closure`](https://docs.rs/serde_closure) for
1111
//! documentation.
1212
13-
#![doc(html_root_url = "https://docs.rs/serde_closure_derive/0.2.14")]
13+
#![doc(html_root_url = "https://docs.rs/serde_closure_derive/0.3.0")]
1414

1515
use proc_macro2::{Span, TokenStream};
1616
use quote::{quote, ToTokens};
@@ -45,7 +45,7 @@ pub fn FnOnce(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
4545
}
4646

4747
#[proc_macro_attribute]
48-
pub fn generalize(
48+
pub fn desugar(
4949
attr: proc_macro::TokenStream, item: proc_macro::TokenStream,
5050
) -> proc_macro::TokenStream {
5151
let args: AttributeArgs = parse_macro_input!(attr);
@@ -54,13 +54,13 @@ pub fn generalize(
5454
Err(err) => return err.to_compile_error().into(),
5555
Ok(item) => item,
5656
};
57-
Generalizer.visit_item_mut(&mut item);
57+
Desugar.visit_item_mut(&mut item);
5858
item.into_token_stream().into()
5959
}
6060

61-
struct Generalizer;
61+
struct Desugar;
6262

63-
impl VisitMut for Generalizer {
63+
impl VisitMut for Desugar {
6464
fn visit_trait_bound_mut(&mut self, i: &mut TraitBound) {
6565
if let PathSegment {
6666
ident,
@@ -107,10 +107,9 @@ impl VisitMut for Generalizer {
107107
Span::call_site(),
108108
))
109109
}));
110-
i.path = syn::parse2(
111-
quote! { ::serde_closure::traits::#ident<(#inputs), Output = #output> },
112-
)
113-
.unwrap();
110+
i.path.segments.last_mut().unwrap().arguments = PathArguments::AngleBracketed(
111+
syn::parse2(quote! { <(#inputs), Output = #output> }).unwrap(),
112+
);
114113
}
115114
}
116115
visit_mut::visit_trait_bound_mut(self, i)

0 commit comments

Comments
 (0)