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

Add Encode/Decode/BorrowDecode constraints for struct generic type parameters in derive macro's outputs #451

@songzhi

Description

@songzhi

For example:

// raw code
use bincode::Encode;

#[derive(Encode)]
struct Foo<T> {
    inner: T,
}

// current derive macro output, and it's failed to compile!
use bincode::Encode;
struct Foo<T> {
    inner: T,
}
impl<T> bincode::enc::Encode for Foo<T> {
    fn encode<E: bincode::enc::Encoder>(
        &self,
        mut encoder: E,
    ) -> core::result::Result<(), bincode::error::EncodeError> {
        bincode::enc::Encode::encode(&self.inner, &mut encoder)?;
        Ok(())
    }
}

// what it should ouput
use bincode::Encode;
struct Foo<T> {
    inner: T,
}
impl<T: Encode> bincode::enc::Encode for Foo<T> {
    fn encode<E: bincode::enc::Encoder>(
        &self,
        mut encoder: E,
    ) -> core::result::Result<(), bincode::error::EncodeError> {
        bincode::enc::Encode::encode(&self.inner, &mut encoder)?;
        Ok(())
    }
}

The current macro needs the type parameter T be T: Encode. But in Rust, the latter one is more common.
I think most of derive macros in Rust ecosystem like serde::Serialize do the latter way.
So it's better for users when bincode's derive macros do it so.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions