# Packable
Genericity over a boolean
- Not integrate it
- Pros: simpler codebase
- Cons: inneficient
- Integrate it the way it was (open PR)
- Pros: more efficient
- Cons: complex codebase
- 2 versions of a type: checked and unchecked
- Cons: hardly maintainable
```rust=
pub const VERIFIED: bool = true;
pub const UNVERIFIED: bool = false;
Packable::unpack::<_, VERIFIED>(unpacker)
pub trait Packable: Sized {
/// The error type that can be returned if some semantic error occurs while unpacking.
///
/// It is recommended to use [`Infallible`](core::convert::Infallible) if this kind of error cannot happen or
/// [`UnknownTagError`] when implementing this trait for an enum.
type UnpackError: Debug;
/// Packs this value into the given [`Packer`].
fn pack<P: Packer>(&self, packer: &mut P) -> Result<(), P::Error>;
/// The size of the value in bytes after being packed.
fn packed_len(&self) -> usize;
/// Unpacks this value from the given [`Unpacker`].
fn unpack<U: Unpacker, const VERIFY: bool>(
unpacker: &mut U,
) -> Result<Self, UnpackError<Self::UnpackError, U::Error>>;
}
/// Extension trait for types that implement `Packable`.
pub trait PackableExt: Packable {
/// Convenience method that packs this value into a [`Vec<u8>`].
fn pack_to_vec(&self) -> Vec<u8>;
/// Unpacks this value from a type that implements [`AsRef<[u8]>`].
fn unpack_verified<T: AsRef<[u8]>>(
bytes: T,
) -> Result<Self, UnpackError<<Self as Packable>::UnpackError, UnexpectedEOF>>;
/// Unpacks this value from a type that implements [`AsRef<[u8]>`].
fn unpack_unverified<T: AsRef<[u8]>>(
bytes: T,
) -> Result<Self, UnpackError<<Self as Packable>::UnpackError, UnexpectedEOF>>;
}
```