Macro bitcoin_hashes::hash_newtype

source ·
macro_rules! hash_newtype {
    ($($(#[$($type_attrs:tt)*])* $type_vis:vis struct $newtype:ident($(#[$field_attrs:tt])* $field_vis:vis $hash:path);)+) => { ... };
}
Expand description

Creates a new newtype around a Hash type.

The syntax is similar to the usual tuple struct syntax:

hash_newtype! {
    /// Hash of `Foo`.
    pub struct MyNewtype(pub sha256::Hash);
}

You can use any valid visibility specifier in place of pub or you can omit either or both, if you want the type or its field to be private.

Whether the hash is reversed or not when displaying depends on the inner type. However you can override it like this:

hash_newtype! {
    #[hash_newtype(backward)]
    struct MyNewtype(sha256::Hash);
}

This will display the hash backwards regardless of what the inner type does. Use forward instead of backward to force displaying forward.

You can add arbitrary doc comments or other attributes to the struct or it’s field. Note that the macro already derives Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd. With the serde feature on, this also adds Serialize and Deserialize implementations.

You can also define multiple newtypes within one macro call:


hash_newtype! {
    /// My custom type 1
    pub struct Newtype1(sha256::Hash);

    /// My custom type 2
    struct Newtype2(hash160::Hash);
}

Note: the macro is internally recursive. If you use too many attributes (> 256 tokens) you may hit recursion limit. If you have so many attributes for a good reason, just raising the limit should be OK. Note however that attribute-processing part has to use TT muncher which has quadratic complexity, so having many attributes may blow up compile time. This should be rare.