Add lints to catch missing traits

Rustc can warn us when we forget to add `Copy` and `Deubg` trait
implementations to types.

Add lint directives to enable warnings for missing `Copy` and `Debug`
implementations. Use the newly emitted warnings to find types that do
not implement our 'standard' traits. These 'standard' traits are defined
as the set of attributes that it has been found beneficial to
opportunistically add to all types, these are

- Copy
- Clone
- Debug
- PartialEq and Eq
- PartialOrd and Ord
- Hash
This commit is contained in:
Tobin Harding 2022-01-07 10:01:11 +11:00
parent 35556e22f2
commit 26921a31b8
4 changed files with 11 additions and 1 deletions

View File

@ -69,16 +69,19 @@ pub trait Signing: Context {}
pub trait Verification: Context {} pub trait Verification: Context {}
/// Represents the set of capabilities needed for signing with a user preallocated memory. /// Represents the set of capabilities needed for signing with a user preallocated memory.
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SignOnlyPreallocated<'buf> { pub struct SignOnlyPreallocated<'buf> {
phantom: PhantomData<&'buf ()>, phantom: PhantomData<&'buf ()>,
} }
/// Represents the set of capabilities needed for verification with a user preallocated memory. /// Represents the set of capabilities needed for verification with a user preallocated memory.
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct VerifyOnlyPreallocated<'buf> { pub struct VerifyOnlyPreallocated<'buf> {
phantom: PhantomData<&'buf ()>, phantom: PhantomData<&'buf ()>,
} }
/// Represents the set of all capabilities with a user preallocated memory. /// Represents the set of all capabilities with a user preallocated memory.
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AllPreallocated<'buf> { pub struct AllPreallocated<'buf> {
phantom: PhantomData<&'buf ()>, phantom: PhantomData<&'buf ()>,
} }
@ -112,14 +115,17 @@ mod alloc_only {
/// Represents the set of capabilities needed for signing. /// Represents the set of capabilities needed for signing.
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))] #[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum SignOnly {} pub enum SignOnly {}
/// Represents the set of capabilities needed for verification. /// Represents the set of capabilities needed for verification.
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))] #[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum VerifyOnly {} pub enum VerifyOnly {}
/// Represents the set of all capabilities. /// Represents the set of all capabilities.
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))] #[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum All {} pub enum All {}
impl Signing for SignOnly {} impl Signing for SignOnly {}

View File

@ -511,7 +511,8 @@ impl Ord for PublicKey {
} }
/// Opaque data structure that holds a keypair consisting of a secret and a public key. /// Opaque data structure that holds a keypair consisting of a secret and a public key.
#[derive(Clone)] // Should secrets implement Copy: https://github.com/rust-bitcoin/rust-secp256k1/issues/363
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct KeyPair(ffi::KeyPair); pub struct KeyPair(ffi::KeyPair);
impl_display_secret!(KeyPair); impl_display_secret!(KeyPair);

View File

@ -132,6 +132,8 @@
#![deny(non_snake_case)] #![deny(non_snake_case)]
#![deny(unused_mut)] #![deny(unused_mut)]
#![warn(missing_docs)] #![warn(missing_docs)]
#![warn(missing_copy_implementations)]
#![warn(missing_debug_implementations)]
#![cfg_attr(all(not(test), not(feature = "std")), no_std)] #![cfg_attr(all(not(test), not(feature = "std")), no_std)]

View File

@ -57,6 +57,7 @@ macro_rules! impl_display_secret {
/// ///
/// [`Display`]: fmt::Display /// [`Display`]: fmt::Display
/// [`Debug`]: fmt::Debug /// [`Debug`]: fmt::Debug
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct DisplaySecret { pub struct DisplaySecret {
secret: [u8; SECRET_KEY_SIZE] secret: [u8; SECRET_KEY_SIZE]
} }