ic_icrc_tx/parser/response/
mod.rs

1use base64::{engine::general_purpose, Engine};
2use candid::Decode;
3use icrc_ledger_types::icrc1::transfer::{BlockIndex, TransferError};
4/// A struct representing the response containing a base64-encoded content map.
5pub struct Response {
6    pub content_map: String,
7}
8
9/// The result type for a transfer, which can either be a `BlockIndex` or a `TransferError`.
10pub type TransferResult = Result<BlockIndex, TransferError>;
11
12/// Parses an ICRC1 transfer response.
13///
14/// This function takes a `Response` input, decodes the base64-encoded content map,
15/// and deserializes it into a `TransferResult`.
16///
17/// # Arguments
18///
19/// * `response` - The `Response` containing the base64-encoded content map.
20///
21/// # Returns
22///
23/// A `TransferResult` which is either a `BlockIndex` or a `TransferError`.
24///
25/// # Panics
26///
27/// This function will panic if the base64 decoding or deserialization fails.
28pub fn parse_icrc1_transfer_response(response: Response) -> TransferResult {
29    // Decode the base64 string to bytes
30    let result_bytes = general_purpose::STANDARD
31        .decode(response.content_map)
32        .unwrap();
33    let result = Decode!(&result_bytes, TransferResult).unwrap();
34
35    println!("Result: {:?}", result);
36
37    result
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_parse_icrc1_err_response() {
46        let content_map = "RElETAhrAryKAX3F/tIBAWsI0cSYfALCkey5An+UwceJBAPrgqiXBAShw+v9BwXwh+bbCQaT5b7IDH/rnNvVDwdsAsfrxNAJccSYsbUNfWwBm7O+pgp9bAGLvfKbAX1sAb+bt/ANfWwBo7uRjAp4bAGcuracAn0BAAEHAA==";
47
48        let response = Response {
49            content_map: content_map.to_string(),
50        };
51
52        let result = parse_icrc1_transfer_response(response);
53
54        assert_eq!(result.is_err(), true);
55    }
56
57    #[test]
58    fn test_parser_icrc1_success_response() {
59        let content_map = "RElETAhrAryKAX3F/tIBAWsI0cSYfALCkey5An+UwceJBAPrgqiXBAShw+v9BwXwh+bbCQaT5b7IDH/rnNvVDwdsAsfrxNAJccSYsbUNfWwBm7O+pgp9bAGLvfKbAX1sAb+bt/ANfWwBo7uRjAp4bAGcuracAn0BAACaAg==";
60        let response = Response {
61            content_map: content_map.to_string(),
62        };
63
64        let result = parse_icrc1_transfer_response(response);
65
66        assert_eq!(result.is_ok(), true);
67    }
68}