1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use core::fmt::Debug;

use crate::prelude::*;

use ibc_proto::ibc::core::commitment::v1::MerkleRoot as RawMerkleRoot;
use ibc_types_domain_type::{DomainType, TypeUrl};

#[derive(Clone, PartialEq, Eq)]
pub struct MerkleRoot {
    pub hash: Vec<u8>,
}

impl Debug for MerkleRoot {
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        write!(f, "{:?}", hex::encode(&self.hash))
    }
}

impl TypeUrl for MerkleRoot {
    const TYPE_URL: &'static str = "/ibc.core.commitment.v1.MerkleRoot";
}

impl DomainType for MerkleRoot {
    type Proto = RawMerkleRoot;
}

impl From<MerkleRoot> for RawMerkleRoot {
    fn from(value: MerkleRoot) -> RawMerkleRoot {
        RawMerkleRoot { hash: value.hash }
    }
}

impl TryFrom<RawMerkleRoot> for MerkleRoot {
    type Error = anyhow::Error;
    fn try_from(value: RawMerkleRoot) -> Result<MerkleRoot, Self::Error> {
        Ok(MerkleRoot { hash: value.hash })
    }
}