Skip to content
This repository was archived by the owner on Aug 15, 2025. It is now read-only.

Commit 150b459

Browse files
Made the derive macros automatically implement the required traits on generic arguments (#454)
1 parent 1b1e053 commit 150b459

File tree

4 files changed

+36
-11
lines changed

4 files changed

+36
-11
lines changed

derive/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ description = "Implementation of #[derive(Encode, Decode)] for bincode"
1616
proc-macro = true
1717

1818
[dependencies]
19-
virtue = "0.0.2"
19+
virtue = "0.0.3"

derive/src/derive_enum.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ impl DeriveEnum {
2121
pub fn generate_encode(self, generator: &mut Generator) -> Result<()> {
2222
generator
2323
.impl_for("bincode::enc::Encode")?
24+
.modify_generic_constraints(|generics, where_constraints| {
25+
for g in generics.iter_generics() {
26+
where_constraints.push_constraint(g, "bincode::enc::Encode").unwrap();
27+
}
28+
})
2429
.generate_fn("encode")
2530
.with_generic("E", ["bincode::enc::Encoder"])
2631
.with_self_arg(FnSelfArg::RefSelf)
@@ -180,6 +185,11 @@ impl DeriveEnum {
180185

181186
generator
182187
.impl_for("bincode::Decode")?
188+
.modify_generic_constraints(|generics, where_constraints| {
189+
for g in generics.iter_generics() {
190+
where_constraints.push_constraint(g, "bincode::enc::Decode").unwrap();
191+
}
192+
})
183193
.generate_fn("decode")
184194
.with_generic("D", ["bincode::de::Decoder"])
185195
.with_arg("mut decoder", "D")
@@ -247,6 +257,11 @@ impl DeriveEnum {
247257
let enum_name = generator.target_name().to_string();
248258

249259
generator.impl_for_with_lifetimes("bincode::de::BorrowDecode", &["__de"])?
260+
.modify_generic_constraints(|generics, where_constraints| {
261+
for g in generics.iter_generics() {
262+
where_constraints.push_constraint(g, "bincode::enc::BorrowDecode").unwrap();
263+
}
264+
})
250265
.generate_fn("borrow_decode")
251266
.with_generic("D", ["bincode::de::BorrowDecoder<'__de>"])
252267
.with_arg("mut decoder", "D")

derive/src/derive_struct.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ impl DeriveStruct {
1212
let DeriveStruct { fields } = self;
1313

1414
generator
15-
.impl_for("bincode::enc::Encode")
16-
.unwrap()
15+
.impl_for("bincode::enc::Encode")?
16+
.modify_generic_constraints(|generics, where_constraints| {
17+
for g in generics.iter_generics() {
18+
where_constraints.push_constraint(g, "bincode::enc::Encode").unwrap();
19+
}
20+
})
1721
.generate_fn("encode")
1822
.with_generic("E", ["bincode::enc::Encoder"])
1923
.with_self_arg(virtue::generate::FnSelfArg::RefSelf)
@@ -46,8 +50,12 @@ impl DeriveStruct {
4650
let DeriveStruct { fields } = self;
4751

4852
generator
49-
.impl_for("bincode::Decode")
50-
.unwrap()
53+
.impl_for("bincode::Decode")?
54+
.modify_generic_constraints(|generics, where_constraints| {
55+
for g in generics.iter_generics() {
56+
where_constraints.push_constraint(g, "bincode::de::Decode").unwrap();
57+
}
58+
})
5159
.generate_fn("decode")
5260
.with_generic("D", ["bincode::de::Decoder"])
5361
.with_arg("mut decoder", "D")
@@ -93,8 +101,12 @@ impl DeriveStruct {
93101
let DeriveStruct { fields } = self;
94102

95103
generator
96-
.impl_for_with_lifetimes("bincode::de::BorrowDecode", &["__de"])
97-
.unwrap()
104+
.impl_for_with_lifetimes("bincode::de::BorrowDecode", &["__de"])?
105+
.modify_generic_constraints(|generics, where_constraints| {
106+
for g in generics.iter_generics() {
107+
where_constraints.push_constraint(g, "bincode::de::BorrowDecode").unwrap();
108+
}
109+
})
98110
.generate_fn("borrow_decode")
99111
.with_generic("D", ["bincode::de::BorrowDecoder<'__de>"])
100112
.with_arg("mut decoder", "D")

tests/derive.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
#![cfg(feature = "derive")]
22

33
use bincode::config::Configuration;
4-
use bincode::{de::Decode, enc::Encode};
5-
64
#[derive(bincode::Encode, PartialEq, Debug)]
7-
pub(crate) struct Test<T: Encode> {
5+
pub(crate) struct Test<T> {
86
a: T,
97
b: u32,
108
c: u8,
119
}
1210

1311
#[derive(bincode::Decode, PartialEq, Debug, Eq)]
14-
pub struct Test2<T: Decode> {
12+
pub struct Test2<T> {
1513
a: T,
1614
b: u32,
1715
c: u32,

0 commit comments

Comments
 (0)