m10_protos/
metadata.rs

1use prost::Message;
2use prost_types::Any;
3
4use crate::sdk::metadata::*;
5use crate::sdk::transaction::{CreateTransfer, TransferStep};
6use crate::sdk::FinalizedTransfer;
7
8pub fn memo(memo: &str) -> Memo {
9    Memo {
10        plaintext: memo.to_string(),
11    }
12}
13
14pub trait MetadataType {
15    const TYPE_URL: &'static str;
16}
17
18pub trait Metadata: MetadataType {
19    fn any(&self) -> Any;
20}
21
22impl<M: MetadataType + Message + Sized + Default> Metadata for M {
23    fn any(&self) -> Any {
24        Any {
25            type_url: Self::TYPE_URL.to_string(),
26            value: self.encode_to_vec(),
27        }
28    }
29}
30
31pub trait MetadataExt {
32    // Deprecated - please use [`protobuf`] instead
33    fn metadata<M: Metadata + Message + Default>(&self) -> Option<M> {
34        self.protobuf::<M>()
35    }
36
37    fn protobuf<M: Metadata + Message + Default>(&self) -> Option<M> {
38        self.with_type::<M>().and_then(|b| M::decode(b).ok())
39    }
40
41    fn with_type<M: MetadataType>(&self) -> Option<&[u8]>;
42
43    fn memo(&self) -> String {
44        self.protobuf::<Memo>().unwrap_or_default().plaintext
45    }
46}
47
48impl MetadataExt for Any {
49    fn with_type<M: MetadataType>(&self) -> Option<&[u8]> {
50        (self.type_url == M::TYPE_URL).then_some(self.value.as_slice())
51    }
52}
53
54impl<T: MetadataExt> MetadataExt for Vec<T> {
55    fn with_type<M: MetadataType>(&self) -> Option<&[u8]> {
56        self.iter().find_map(MetadataExt::with_type::<M>)
57    }
58}
59
60impl MetadataExt for TransferStep {
61    fn with_type<M: MetadataType>(&self) -> Option<&[u8]> {
62        self.metadata.with_type::<M>()
63    }
64}
65
66impl MetadataExt for CreateTransfer {
67    fn with_type<M: MetadataType>(&self) -> Option<&[u8]> {
68        self.transfer_steps.with_type::<M>()
69    }
70}
71
72impl MetadataExt for FinalizedTransfer {
73    fn with_type<M: MetadataType>(&self) -> Option<&[u8]> {
74        self.transfer_steps.with_type::<M>()
75    }
76}
77
78impl MetadataType for Attachment {
79    const TYPE_URL: &'static str = "m10.sdk.metadata.Attachment";
80}
81
82impl MetadataType for Memo {
83    const TYPE_URL: &'static str = "m10.sdk.metadata.Memo";
84}
85
86impl MetadataType for Fee {
87    const TYPE_URL: &'static str = "m10.sdk.metadata.Fee";
88}
89
90impl MetadataType for Withdraw {
91    const TYPE_URL: &'static str = "m10.sdk.metadata.Withdraw";
92}
93
94impl MetadataType for Deposit {
95    const TYPE_URL: &'static str = "m10.sdk.metadata.Deposit";
96}
97
98impl MetadataType for Contract {
99    const TYPE_URL: &'static str = "m10.sdk.metadata.Contract";
100}
101
102impl MetadataType for SelfTransfer {
103    const TYPE_URL: &'static str = "m10.sdk.metadata.SelfTransfer";
104}
105
106impl MetadataType for RebalanceTransfer {
107    const TYPE_URL: &'static str = "m10.sdk.metadata.RebalanceTransfer";
108}
109
110impl MetadataType for TokenWithdraw {
111    const TYPE_URL: &'static str = "m10.sdk.metadata.OfflineToken";
112}
113
114impl MetadataType for OfflineTransfer {
115    const TYPE_URL: &'static str = "m10.sdk.metadata.OfflineTransfer";
116}