1use crate::wallet::error::WalletError;
11use crate::wallet::interfaces::*;
12use crate::wallet::serializer::frame::{read_result_frame, write_request_frame, RequestFrame};
13use crate::wallet::substrates::wallet_wire_calls::WalletWireCall;
14use crate::wallet::substrates::WalletWire;
15
16pub struct WalletWireTransceiver<W: WalletWire> {
19 wire: W,
20}
21
22impl<W: WalletWire> WalletWireTransceiver<W> {
23 pub fn new(wire: W) -> Self {
25 Self { wire }
26 }
27
28 async fn transmit(
30 &self,
31 call: WalletWireCall,
32 originator: Option<&str>,
33 params: Vec<u8>,
34 ) -> Result<Vec<u8>, WalletError> {
35 let frame = write_request_frame(&RequestFrame {
36 call: call as u8,
37 originator: originator.unwrap_or("").to_string(),
38 params,
39 });
40
41 let result = self.wire.transmit_to_wallet(&frame).await?;
42 read_result_frame(&result)
43 }
44}
45
46macro_rules! impl_wire_method {
49 ($method:ident, $call:ident, $args_type:ty, $result_type:ty,
51 $serialize:path, $deserialize:path) => {
52 async fn $method(
53 &self,
54 args: $args_type,
55 originator: Option<&str>,
56 ) -> Result<$result_type, WalletError> {
57 let data = $serialize(&args)?;
58 let resp = self
59 .transmit(WalletWireCall::$call, originator, data)
60 .await?;
61 $deserialize(&resp)
62 }
63 };
64 (no_args $method:ident, $call:ident, $result_type:ty, $deserialize:path) => {
66 async fn $method(&self, originator: Option<&str>) -> Result<$result_type, WalletError> {
67 let resp = self
68 .transmit(WalletWireCall::$call, originator, Vec::new())
69 .await?;
70 $deserialize(&resp)
71 }
72 };
73}
74
75use crate::wallet::serializer::{
76 abort_action, acquire_certificate, authenticated, certificate_ser, create_action, create_hmac,
77 create_signature, decrypt, discover_by_attributes, discover_by_identity_key,
78 discover_certificates_result, encrypt, get_header, get_height, get_network, get_public_key,
79 get_version, internalize_action, list_actions, list_certificates, list_outputs,
80 prove_certificate, relinquish_certificate, relinquish_output, reveal_counterparty_key_linkage,
81 reveal_specific_key_linkage, sign_action, verify_hmac, verify_signature,
82};
83
84#[allow(async_fn_in_trait)]
85impl<W: WalletWire> WalletInterface for WalletWireTransceiver<W> {
86 impl_wire_method!(
87 create_action,
88 CreateAction,
89 CreateActionArgs,
90 CreateActionResult,
91 create_action::serialize_create_action_args,
92 create_action::deserialize_create_action_result
93 );
94
95 impl_wire_method!(
96 sign_action,
97 SignAction,
98 SignActionArgs,
99 SignActionResult,
100 sign_action::serialize_sign_action_args,
101 sign_action::deserialize_sign_action_result
102 );
103
104 impl_wire_method!(
105 abort_action,
106 AbortAction,
107 AbortActionArgs,
108 AbortActionResult,
109 abort_action::serialize_abort_action_args,
110 abort_action::deserialize_abort_action_result
111 );
112
113 impl_wire_method!(
114 list_actions,
115 ListActions,
116 ListActionsArgs,
117 ListActionsResult,
118 list_actions::serialize_list_actions_args,
119 list_actions::deserialize_list_actions_result
120 );
121
122 impl_wire_method!(
123 internalize_action,
124 InternalizeAction,
125 InternalizeActionArgs,
126 InternalizeActionResult,
127 internalize_action::serialize_internalize_action_args,
128 internalize_action::deserialize_internalize_action_result
129 );
130
131 impl_wire_method!(
132 list_outputs,
133 ListOutputs,
134 ListOutputsArgs,
135 ListOutputsResult,
136 list_outputs::serialize_list_outputs_args,
137 list_outputs::deserialize_list_outputs_result
138 );
139
140 impl_wire_method!(
141 relinquish_output,
142 RelinquishOutput,
143 RelinquishOutputArgs,
144 RelinquishOutputResult,
145 relinquish_output::serialize_relinquish_output_args,
146 relinquish_output::deserialize_relinquish_output_result
147 );
148
149 impl_wire_method!(
150 get_public_key,
151 GetPublicKey,
152 GetPublicKeyArgs,
153 GetPublicKeyResult,
154 get_public_key::serialize_get_public_key_args,
155 get_public_key::deserialize_get_public_key_result
156 );
157
158 impl_wire_method!(
159 reveal_counterparty_key_linkage,
160 RevealCounterpartyKeyLinkage,
161 RevealCounterpartyKeyLinkageArgs,
162 RevealCounterpartyKeyLinkageResult,
163 reveal_counterparty_key_linkage::serialize_reveal_counterparty_key_linkage_args,
164 reveal_counterparty_key_linkage::deserialize_reveal_counterparty_key_linkage_result
165 );
166
167 impl_wire_method!(
168 reveal_specific_key_linkage,
169 RevealSpecificKeyLinkage,
170 RevealSpecificKeyLinkageArgs,
171 RevealSpecificKeyLinkageResult,
172 reveal_specific_key_linkage::serialize_reveal_specific_key_linkage_args,
173 reveal_specific_key_linkage::deserialize_reveal_specific_key_linkage_result
174 );
175
176 impl_wire_method!(
177 encrypt,
178 Encrypt,
179 EncryptArgs,
180 EncryptResult,
181 encrypt::serialize_encrypt_args,
182 encrypt::deserialize_encrypt_result
183 );
184
185 impl_wire_method!(
186 decrypt,
187 Decrypt,
188 DecryptArgs,
189 DecryptResult,
190 decrypt::serialize_decrypt_args,
191 decrypt::deserialize_decrypt_result
192 );
193
194 impl_wire_method!(
195 create_hmac,
196 CreateHmac,
197 CreateHmacArgs,
198 CreateHmacResult,
199 create_hmac::serialize_create_hmac_args,
200 create_hmac::deserialize_create_hmac_result
201 );
202
203 impl_wire_method!(
204 verify_hmac,
205 VerifyHmac,
206 VerifyHmacArgs,
207 VerifyHmacResult,
208 verify_hmac::serialize_verify_hmac_args,
209 verify_hmac::deserialize_verify_hmac_result
210 );
211
212 impl_wire_method!(
213 create_signature,
214 CreateSignature,
215 CreateSignatureArgs,
216 CreateSignatureResult,
217 create_signature::serialize_create_signature_args,
218 create_signature::deserialize_create_signature_result
219 );
220
221 impl_wire_method!(
222 verify_signature,
223 VerifySignature,
224 VerifySignatureArgs,
225 VerifySignatureResult,
226 verify_signature::serialize_verify_signature_args,
227 verify_signature::deserialize_verify_signature_result
228 );
229
230 impl_wire_method!(
231 acquire_certificate,
232 AcquireCertificate,
233 AcquireCertificateArgs,
234 Certificate,
235 acquire_certificate::serialize_acquire_certificate_args,
236 certificate_ser::deserialize_certificate
237 );
238
239 impl_wire_method!(
240 list_certificates,
241 ListCertificates,
242 ListCertificatesArgs,
243 ListCertificatesResult,
244 list_certificates::serialize_list_certificates_args,
245 list_certificates::deserialize_list_certificates_result
246 );
247
248 impl_wire_method!(
249 prove_certificate,
250 ProveCertificate,
251 ProveCertificateArgs,
252 ProveCertificateResult,
253 prove_certificate::serialize_prove_certificate_args,
254 prove_certificate::deserialize_prove_certificate_result
255 );
256
257 impl_wire_method!(
258 relinquish_certificate,
259 RelinquishCertificate,
260 RelinquishCertificateArgs,
261 RelinquishCertificateResult,
262 relinquish_certificate::serialize_relinquish_certificate_args,
263 relinquish_certificate::deserialize_relinquish_certificate_result
264 );
265
266 impl_wire_method!(
267 discover_by_identity_key,
268 DiscoverByIdentityKey,
269 DiscoverByIdentityKeyArgs,
270 DiscoverCertificatesResult,
271 discover_by_identity_key::serialize_discover_by_identity_key_args,
272 discover_certificates_result::deserialize_discover_certificates_result
273 );
274
275 impl_wire_method!(
276 discover_by_attributes,
277 DiscoverByAttributes,
278 DiscoverByAttributesArgs,
279 DiscoverCertificatesResult,
280 discover_by_attributes::serialize_discover_by_attributes_args,
281 discover_certificates_result::deserialize_discover_certificates_result
282 );
283
284 impl_wire_method!(no_args
285 is_authenticated, IsAuthenticated, AuthenticatedResult,
286 authenticated::deserialize_is_authenticated_result
287 );
288
289 impl_wire_method!(no_args
290 wait_for_authentication, WaitForAuthentication, AuthenticatedResult,
291 authenticated::deserialize_wait_authenticated_result
292 );
293
294 impl_wire_method!(no_args
295 get_height, GetHeight, GetHeightResult,
296 get_height::deserialize_get_height_result
297 );
298
299 impl_wire_method!(
300 get_header_for_height,
301 GetHeaderForHeight,
302 GetHeaderArgs,
303 GetHeaderResult,
304 get_header::serialize_get_header_args,
305 get_header::deserialize_get_header_result
306 );
307
308 impl_wire_method!(no_args
309 get_network, GetNetwork, GetNetworkResult,
310 get_network::deserialize_get_network_result
311 );
312
313 impl_wire_method!(no_args
314 get_version, GetVersion, GetVersionResult,
315 get_version::deserialize_get_version_result
316 );
317}