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 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}