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
use crate::error::CosmosClientError;
use cosmos_sdk_proto::cosmos::auth::v1beta1::BaseAccount;
use cosmos_sdk_proto::cosmos::crypto::ed25519::PubKey;
use cosmos_sdk_proto::cosmos::evidence::v1beta1::Equivocation;
use cosmos_sdk_proto::cosmos::feegrant::v1beta1::BasicAllowance;
use cosmos_sdk_proto::Any;
use cosmrs::bank::MsgSend;
use prost::Message;

#[derive(Debug)]
pub enum CosmosType {
    BaseAccount(BaseAccount),
    PubKey(PubKey),
    Equivocation(Equivocation),
    BasicAllowance(BasicAllowance),
    MsgSend(MsgSend),
}

pub fn any_to_cosmos(cosmos: &Any) -> Result<CosmosType, CosmosClientError> {
    match cosmos.type_url.as_str() {
        "/cosmos.auth.v1beta1.BaseAccount" => Ok(CosmosType::BaseAccount(BaseAccount::decode(
            cosmos.value.as_slice(),
        )?)),
        "/cosmos.crypto.secp256k1.PubKey" => {
            Ok(CosmosType::PubKey(PubKey::decode(cosmos.value.as_slice())?))
        }
        "/cosmos.evidence.v1beta1.Equivocation" => Ok(CosmosType::Equivocation(
            Equivocation::decode(cosmos.value.as_slice())?,
        )),
        "/cosmos.feegrant.v1beta1.BasicAllowance" => Ok(CosmosType::BasicAllowance(
            BasicAllowance::decode(cosmos.value.as_slice())?,
        )),
        _ => Err(CosmosClientError::UnknownCosmosMsg),
    }
}