Made the derive macros automatically implement the required traits on generic arguments (#454)

This commit is contained in:
Trangar 2021-12-14 15:18:13 +01:00 committed by GitHub
parent a5255465bd
commit 7690da5203
4 changed files with 36 additions and 11 deletions

View File

@ -16,4 +16,4 @@ description = "Implementation of #[derive(Encode, Decode)] for bincode"
proc-macro = true
[dependencies]
virtue = "0.0.2"
virtue = "0.0.3"

View File

@ -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")

View File

@ -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")

View File

@ -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,