novax_data/types/
buffer.rs

1use multiversx_sc::api::ManagedTypeApi;
2use multiversx_sc::types::{EgldOrEsdtTokenIdentifier, ManagedBuffer, TokenIdentifier};
3use multiversx_sc_scenario::api::StaticApi;
4use crate::constants::EGLD_TOKEN_IDENTIFIER;
5use crate::types::managed::ManagedConvertible;
6use crate::types::native::NativeConvertible;
7
8impl NativeConvertible for String {
9    type Native = String;
10
11    fn to_native(&self) -> Self::Native {
12        self.clone()
13    }
14}
15
16impl<M: ManagedTypeApi> NativeConvertible for ManagedBuffer<M> {
17    type Native = String;
18
19    fn to_native(&self) -> Self::Native {
20        let bytes = self.to_boxed_bytes();
21        let result = String::from_utf8_lossy(bytes.as_slice());
22
23        result.to_string()
24    }
25}
26
27impl<M: ManagedTypeApi> NativeConvertible for TokenIdentifier<M> {
28    type Native = String;
29
30    fn to_native(&self) -> Self::Native {
31        self.as_managed_buffer().to_native()
32    }
33}
34
35impl<M: ManagedTypeApi> NativeConvertible for EgldOrEsdtTokenIdentifier<M> {
36    type Native = String;
37
38    fn to_native(&self) -> Self::Native {
39        if self.is_egld() {
40            EGLD_TOKEN_IDENTIFIER.to_string()
41        } else {
42            self.clone().unwrap_esdt().to_native()
43        }
44    }
45}
46
47impl ManagedConvertible<ManagedBuffer<StaticApi>> for String {
48    fn to_managed(&self) -> ManagedBuffer<StaticApi> {
49        ManagedBuffer::from(self.as_bytes())
50    }
51}
52
53impl ManagedConvertible<TokenIdentifier<StaticApi>> for String {
54    fn to_managed(&self) -> TokenIdentifier<StaticApi> {
55        TokenIdentifier::from(self.as_bytes())
56    }
57}
58
59impl ManagedConvertible<EgldOrEsdtTokenIdentifier<StaticApi>> for String {
60    fn to_managed(&self) -> EgldOrEsdtTokenIdentifier<StaticApi> {
61        if self == EGLD_TOKEN_IDENTIFIER {
62            EgldOrEsdtTokenIdentifier::egld()
63        } else {
64            let token_identifier: TokenIdentifier<StaticApi> = self.to_managed();
65            EgldOrEsdtTokenIdentifier::esdt(token_identifier)
66        }
67    }
68}
69
70#[cfg(test)]
71mod tests {
72    use multiversx_sc::types::{ManagedBuffer, TokenIdentifier};
73    use multiversx_sc_scenario::api::StaticApi;
74    use crate::types::managed::ManagedConvertible;
75    use crate::types::native::NativeConvertible;
76
77    #[test]
78    fn test_managed_buffer_to_native() {
79        let buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("This is a buffer");
80        let native = buffer.to_native();
81
82        let expected = String::from("This is a buffer");
83
84        assert_eq!(
85            native,
86            expected
87        );
88    }
89
90    #[test]
91    fn test_token_identifier_to_native() {
92        let buffer: TokenIdentifier<StaticApi> = TokenIdentifier::from("WEGLD-abcdef");
93        let native = buffer.to_native();
94
95        let expected = String::from("WEGLD-abcdef");
96
97        assert_eq!(
98            native,
99            expected
100        );
101    }
102
103    #[test]
104    fn test_string_to_managed_buffer() {
105        let value = "This is a buffer".to_string();
106        let managed: ManagedBuffer<StaticApi> = value.to_managed();
107
108        assert_eq!(
109            value.as_bytes(),
110            managed.to_boxed_bytes().as_slice()
111        );
112    }
113
114    #[test]
115    fn test_string_to_token_identifier() {
116        let value = "WEGLD-abcdef".to_string();
117        let managed: TokenIdentifier<StaticApi> = value.to_managed();
118
119        assert_eq!(
120            value.as_bytes(),
121            managed.to_boxed_bytes().as_slice()
122        );
123    }
124}