Skip to main content

iq_cometbft/block/
meta.rs

1//! Block metadata
2
3use cometbft_proto::types::v1::BlockMeta as RawMeta;
4use serde::{Deserialize, Serialize};
5
6use super::{Header, Id};
7use crate::prelude::*;
8
9/// Block metadata - Todo: implement constructor and getters
10#[derive(Serialize, Deserialize, Clone, Debug)]
11#[serde(try_from = "RawMeta", into = "RawMeta")]
12pub struct Meta {
13    /// ID of the block
14    pub block_id: Id,
15
16    /// block size - Todo: make this robust (u63)
17    pub block_size: i64,
18
19    /// Header of the block
20    pub header: Header,
21
22    /// Number of transactions - Todo: make this robust (u63)
23    pub num_txs: i64,
24}
25
26cometbft_old_pb_modules! {
27    use super::Meta;
28    use crate::{error::Error, prelude::*};
29    use pb::types::BlockMeta as RawMeta;
30
31    impl TryFrom<RawMeta> for Meta {
32        type Error = Error;
33
34        fn try_from(value: RawMeta) -> Result<Self, Self::Error> {
35            Ok(Meta {
36                block_id: value
37                    .block_id
38                    .ok_or_else(|| Error::invalid_block("no block_id".to_string()))?
39                    .try_into()?,
40                block_size: value.block_size,
41                header: value
42                    .header
43                    .ok_or_else(|| Error::invalid_block("no header".to_string()))?
44                    .try_into()?,
45                num_txs: value.num_txs,
46            })
47        }
48    }
49
50    impl From<Meta> for RawMeta {
51        fn from(value: Meta) -> Self {
52            RawMeta {
53                block_id: Some(value.block_id.into()),
54                block_size: value.block_size,
55                header: Some(value.header.into()),
56                num_txs: value.num_txs,
57            }
58        }
59    }
60}
61
62mod v1 {
63    use super::Meta;
64    use crate::{error::Error, prelude::*};
65    use cometbft_proto::types::v1 as pb;
66
67    impl TryFrom<pb::BlockMeta> for Meta {
68        type Error = Error;
69
70        fn try_from(value: pb::BlockMeta) -> Result<Self, Self::Error> {
71            Ok(Meta {
72                block_id: value
73                    .block_id
74                    .ok_or_else(|| Error::invalid_block("no block_id".to_string()))?
75                    .try_into()?,
76                block_size: value.block_size,
77                header: value
78                    .header
79                    .ok_or_else(|| Error::invalid_block("no header".to_string()))?
80                    .try_into()?,
81                num_txs: value.num_txs,
82            })
83        }
84    }
85
86    impl From<Meta> for pb::BlockMeta {
87        fn from(value: Meta) -> Self {
88            pb::BlockMeta {
89                block_id: Some(value.block_id.into()),
90                block_size: value.block_size,
91                header: Some(value.header.into()),
92                num_txs: value.num_txs,
93            }
94        }
95    }
96}
97
98mod v1beta1 {
99    use super::Meta;
100    use crate::{error::Error, prelude::*};
101    use cometbft_proto::types::v1beta1 as pb;
102
103    impl TryFrom<pb::BlockMeta> for Meta {
104        type Error = Error;
105
106        fn try_from(value: pb::BlockMeta) -> Result<Self, Self::Error> {
107            Ok(Meta {
108                block_id: value
109                    .block_id
110                    .ok_or_else(|| Error::invalid_block("no block_id".to_string()))?
111                    .try_into()?,
112                block_size: value.block_size,
113                header: value
114                    .header
115                    .ok_or_else(|| Error::invalid_block("no header".to_string()))?
116                    .try_into()?,
117                num_txs: value.num_txs,
118            })
119        }
120    }
121
122    impl From<Meta> for pb::BlockMeta {
123        fn from(value: Meta) -> Self {
124            pb::BlockMeta {
125                block_id: Some(value.block_id.into()),
126                block_size: value.block_size,
127                header: Some(value.header.into()),
128                num_txs: value.num_txs,
129            }
130        }
131    }
132}