miden_objects/conversion/
mod.rs1mod 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;