Skip to main content

miden_objects/conversion/
mod.rs

1mod account;
2mod account_patch;
3mod asset;
4mod batch;
5mod block;
6mod merkle;
7mod note;
8mod primitives;
9mod protocol_config;
10mod transaction;
11mod transaction_inputs;
12
13use core::marker::PhantomData;
14
15pub use batch::{decode_proposed_batch, decode_proven_batch, decode_standalone_proven_batch};
16
17use crate::ConversionError;
18
19pub(crate) struct MessageDecoder<M>(PhantomData<M>);
20
21impl<M: prost::Message> Default for MessageDecoder<M> {
22    fn default() -> Self {
23        Self(PhantomData)
24    }
25}
26
27impl<M: prost::Message> MessageDecoder<M> {
28    pub(crate) fn required<T, U>(
29        &self,
30        name: &'static str,
31        value: Option<T>,
32    ) -> Result<U, ConversionError>
33    where
34        T: TryInto<U>,
35        T::Error: Into<ConversionError>,
36    {
37        value
38            .ok_or_else(|| ConversionError::missing_field::<M>(name))?
39            .try_into()
40            .map_err(Into::into)
41            .map_err(|error: ConversionError| error.context(name))
42    }
43}
44
45pub(crate) trait MessageDecodeExt: prost::Message + Sized {
46    fn decoder(&self) -> MessageDecoder<Self> {
47        MessageDecoder::default()
48    }
49}
50
51impl<T: prost::Message> MessageDecodeExt for T {}
52
53macro_rules! required {
54    ($decoder:ident, $message:ident. $field:ident) => {
55        $decoder.required(stringify!($field), $message.$field)
56    };
57    ($decoder:ident, $field:ident) => {
58        $decoder.required(stringify!($field), $field)
59    };
60}
61
62pub(crate) use required;