diff --git a/derive/Cargo.toml b/derive/Cargo.toml index a89e617..d84b6d1 100644 --- a/derive/Cargo.toml +++ b/derive/Cargo.toml @@ -16,4 +16,4 @@ description = "Implementation of #[derive(Encode, Decode)] for bincode" proc-macro = true [dependencies] -virtue = "0.0.2" +virtue = "0.0.3" diff --git a/derive/src/derive_enum.rs b/derive/src/derive_enum.rs index f4a05c9..c9d257b 100644 --- a/derive/src/derive_enum.rs +++ b/derive/src/derive_enum.rs @@ -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) @@ -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") @@ -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") diff --git a/derive/src/derive_struct.rs b/derive/src/derive_struct.rs index 1be81a1..8c21c55 100644 --- a/derive/src/derive_struct.rs +++ b/derive/src/derive_struct.rs @@ -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) @@ -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") @@ -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") diff --git a/tests/derive.rs b/tests/derive.rs index c33267a..92e8164 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -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 { +pub(crate) struct Test { a: T, b: u32, c: u8, } #[derive(bincode::Decode, PartialEq, Debug, Eq)] -pub struct Test2 { +pub struct Test2 { a: T, b: u32, c: u32,