multiversx_sc/storage/mappers/token/
token_mapper_state.rs

1use crate::{
2    api::ManagedTypeApi,
3    codec::{self},
4    types::{ManagedBuffer, TokenIdentifier},
5};
6
7const PENDING_ENCODING: &[u8; 7] = b"pending";
8
9#[derive(Default, Clone)]
10pub enum TokenMapperState<M: ManagedTypeApi> {
11    #[default]
12    NotSet,
13    Pending,
14    Token(TokenIdentifier<M>),
15}
16
17impl<M: ManagedTypeApi> TokenMapperState<M> {
18    pub fn is_set(&self) -> bool {
19        matches!(self, TokenMapperState::Token(_))
20    }
21
22    pub fn is_pending(&self) -> bool {
23        matches!(self, TokenMapperState::Pending)
24    }
25
26    pub fn is_not_set(&self) -> bool {
27        matches!(self, TokenMapperState::NotSet)
28    }
29
30    pub fn is_not_available(&self) -> bool {
31        matches!(self, TokenMapperState::Pending | TokenMapperState::NotSet)
32    }
33}
34
35impl<M: ManagedTypeApi> codec::TopEncode for TokenMapperState<M> {
36    fn top_encode_or_handle_err<O, H>(
37        &self,
38        output: O,
39        h: H,
40    ) -> core::result::Result<(), H::HandledErr>
41    where
42        O: codec::TopEncodeOutput,
43        H: codec::EncodeErrorHandler,
44    {
45        match self {
46            TokenMapperState::NotSet => codec::TopEncode::top_encode_or_handle_err(&"", output, h),
47            TokenMapperState::Pending => {
48                codec::TopEncode::top_encode_or_handle_err(&"pending", output, h)
49            }
50            TokenMapperState::Token(token) => {
51                codec::TopEncode::top_encode_or_handle_err(&token, output, h)
52            }
53        }
54    }
55}
56
57impl<M: ManagedTypeApi> codec::TopDecode for TokenMapperState<M> {
58    fn top_decode_or_handle_err<I, H>(input: I, h: H) -> core::result::Result<Self, H::HandledErr>
59    where
60        I: codec::TopDecodeInput,
61        H: codec::DecodeErrorHandler,
62    {
63        let decoded_input = ManagedBuffer::top_decode_or_handle_err(input, h)?;
64        if decoded_input.is_empty() {
65            Ok(TokenMapperState::NotSet)
66        } else if decoded_input == PENDING_ENCODING {
67            Ok(TokenMapperState::Pending)
68        } else {
69            let token_id = TokenIdentifier::from_esdt_bytes(decoded_input);
70            Ok(TokenMapperState::Token(token_id))
71        }
72    }
73}