1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Copyright 2021 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

use crate::block::output::FoundryId;

impl_id!(pub TokenId, 38, "TODO.");

#[cfg(feature = "serde")]
string_serde_impl!(TokenId);

impl From<FoundryId> for TokenId {
    fn from(foundry_id: FoundryId) -> Self {
        TokenId::new(*foundry_id)
    }
}

#[cfg(feature = "dto")]
#[allow(missing_docs)]
pub mod dto {
    use serde::{Deserialize, Serialize};

    use super::*;
    use crate::block::error::dto::DtoError;

    /// Describes a token id.
    #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
    pub struct TokenIdDto(pub String);

    impl From<&TokenId> for TokenIdDto {
        fn from(value: &TokenId) -> Self {
            Self(prefix_hex::encode(**value))
        }
    }

    impl TryFrom<&TokenIdDto> for TokenId {
        type Error = DtoError;

        fn try_from(value: &TokenIdDto) -> Result<Self, Self::Error> {
            let token_id: [u8; TokenId::LENGTH] =
                prefix_hex::decode(&value.0).map_err(|_e| DtoError::InvalidField("tokenId"))?;
            Ok(TokenId::new(token_id))
        }
    }
}