Skip to content

Commit

Permalink
Made the derive macros automatically implement the required traits on…
Browse files Browse the repository at this point in the history
… generic arguments (#454)
  • Loading branch information
VictorKoenders committed Dec 14, 2021
1 parent 1b1e053 commit 150b459
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 11 deletions.
2 changes: 1 addition & 1 deletion derive/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ description = "Implementation of #[derive(Encode, Decode)] for bincode"
proc-macro = true

[dependencies]
virtue = "0.0.2"
virtue = "0.0.3"
15 changes: 15 additions & 0 deletions derive/src/derive_enum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ impl DeriveEnum {
pub fn generate_encode(self, generator: &mut Generator) -> Result<()> {
generator
.impl_for("bincode::enc::Encode")?
.modify_generic_constraints(|generics, where_constraints| {
for g in generics.iter_generics() {
where_constraints.push_constraint(g, "bincode::enc::Encode").unwrap();
}
})
.generate_fn("encode")
.with_generic("E", ["bincode::enc::Encoder"])
.with_self_arg(FnSelfArg::RefSelf)
Expand Down Expand Up @@ -180,6 +185,11 @@ impl DeriveEnum {

generator
.impl_for("bincode::Decode")?
.modify_generic_constraints(|generics, where_constraints| {
for g in generics.iter_generics() {
where_constraints.push_constraint(g, "bincode::enc::Decode").unwrap();
}
})
.generate_fn("decode")
.with_generic("D", ["bincode::de::Decoder"])
.with_arg("mut decoder", "D")
Expand Down Expand Up @@ -247,6 +257,11 @@ impl DeriveEnum {
let enum_name = generator.target_name().to_string();

generator.impl_for_with_lifetimes("bincode::de::BorrowDecode", &["__de"])?
.modify_generic_constraints(|generics, where_constraints| {
for g in generics.iter_generics() {
where_constraints.push_constraint(g, "bincode::enc::BorrowDecode").unwrap();
}
})
.generate_fn("borrow_decode")
.with_generic("D", ["bincode::de::BorrowDecoder<'__de>"])
.with_arg("mut decoder", "D")
Expand Down
24 changes: 18 additions & 6 deletions derive/src/derive_struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ impl DeriveStruct {
let DeriveStruct { fields } = self;

generator
.impl_for("bincode::enc::Encode")
.unwrap()
.impl_for("bincode::enc::Encode")?
.modify_generic_constraints(|generics, where_constraints| {
for g in generics.iter_generics() {
where_constraints.push_constraint(g, "bincode::enc::Encode").unwrap();
}
})
.generate_fn("encode")
.with_generic("E", ["bincode::enc::Encoder"])
.with_self_arg(virtue::generate::FnSelfArg::RefSelf)
Expand Down Expand Up @@ -46,8 +50,12 @@ impl DeriveStruct {
let DeriveStruct { fields } = self;

generator
.impl_for("bincode::Decode")
.unwrap()
.impl_for("bincode::Decode")?
.modify_generic_constraints(|generics, where_constraints| {
for g in generics.iter_generics() {
where_constraints.push_constraint(g, "bincode::de::Decode").unwrap();
}
})
.generate_fn("decode")
.with_generic("D", ["bincode::de::Decoder"])
.with_arg("mut decoder", "D")
Expand Down Expand Up @@ -93,8 +101,12 @@ impl DeriveStruct {
let DeriveStruct { fields } = self;

generator
.impl_for_with_lifetimes("bincode::de::BorrowDecode", &["__de"])
.unwrap()
.impl_for_with_lifetimes("bincode::de::BorrowDecode", &["__de"])?
.modify_generic_constraints(|generics, where_constraints| {
for g in generics.iter_generics() {
where_constraints.push_constraint(g, "bincode::de::BorrowDecode").unwrap();
}
})
.generate_fn("borrow_decode")
.with_generic("D", ["bincode::de::BorrowDecoder<'__de>"])
.with_arg("mut decoder", "D")
Expand Down
6 changes: 2 additions & 4 deletions tests/derive.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
#![cfg(feature = "derive")]

use bincode::config::Configuration;
use bincode::{de::Decode, enc::Encode};

#[derive(bincode::Encode, PartialEq, Debug)]
pub(crate) struct Test<T: Encode> {
pub(crate) struct Test<T> {
a: T,
b: u32,
c: u8,
}

#[derive(bincode::Decode, PartialEq, Debug, Eq)]
pub struct Test2<T: Decode> {
pub struct Test2<T> {
a: T,
b: u32,
c: u32,
Expand Down

0 comments on commit 150b459

Please sign in to comment.