multiversx_sc/storage/mappers/token/
token_mapper_state.rs1use 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}