radix-transactions 1.3.1

Various Radix transaction models and the manifest compiler/decompiler, from the Radix DLT project.
Documentation
use crate::internal_prelude::*;

#[derive(Clone, Copy)]
pub struct TransactionHashDisplayContext<'a> {
    pub encoder: Option<&'a TransactionHashBech32Encoder>,
}

impl<'a> TransactionHashDisplayContext<'a> {
    pub fn with_encoder(encoder: &'a TransactionHashBech32Encoder) -> Self {
        TransactionHashDisplayContext {
            encoder: Some(encoder),
        }
    }
}

impl<'a> From<&'a TransactionHashBech32Encoder> for TransactionHashDisplayContext<'a> {
    fn from(encoder: &'a TransactionHashBech32Encoder) -> Self {
        Self::with_encoder(encoder)
    }
}

impl<'a> From<Option<&'a TransactionHashBech32Encoder>> for TransactionHashDisplayContext<'a> {
    fn from(encoder: Option<&'a TransactionHashBech32Encoder>) -> Self {
        Self { encoder }
    }
}

macro_rules! impl_contextual_display {
    ($($type: ty),* $(,)?) => {
        $(
            impl<'a> ContextualDisplay<TransactionHashDisplayContext<'a>> for $type {
                type Error = fmt::Error;

                fn contextual_format(
                    &self,
                    f: &mut fmt::Formatter,
                    context: &TransactionHashDisplayContext<'a>,
                ) -> Result<(), Self::Error> {
                    if let Some(encoder) = context.encoder {
                        encoder.encode_to_fmt(f, self).map_err(|_| fmt::Error)
                    } else {
                        write!(f, "{}", self.as_inner_hash())
                    }
                }
            }
        )*
    };
}

impl_contextual_display![
    TransactionIntentHash,
    SignedTransactionIntentHash,
    IntentHash,
    SubintentHash,
    NotarizedTransactionHash,
    SystemTransactionHash,
    LedgerTransactionHash,
];