lwk/types/
asset_id.rs

1use std::{fmt::Display, str::FromStr};
2
3use elements::hex::ToHex;
4
5use crate::UniffiCustomTypeConverter;
6
7/// A valid asset identifier.
8///
9/// 32 bytes encoded as hex string.
10#[derive(PartialEq, Eq, Debug, Hash, Clone, Copy, PartialOrd, Ord)]
11pub struct AssetId {
12    inner: elements::AssetId,
13}
14
15impl Display for AssetId {
16    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17        write!(f, "{}", self.inner)
18    }
19}
20
21impl From<elements::AssetId> for AssetId {
22    fn from(inner: elements::AssetId) -> Self {
23        AssetId { inner }
24    }
25}
26
27impl From<AssetId> for elements::AssetId {
28    fn from(value: AssetId) -> Self {
29        value.inner
30    }
31}
32
33uniffi::custom_type!(AssetId, String);
34impl UniffiCustomTypeConverter for AssetId {
35    type Builtin = String;
36
37    fn into_custom(val: Self::Builtin) -> uniffi::Result<Self> {
38        let inner = elements::AssetId::from_str(&val)?;
39        Ok(AssetId { inner })
40    }
41
42    fn from_custom(obj: Self) -> Self::Builtin {
43        obj.inner.to_hex()
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::AssetId;
50    use crate::UniffiCustomTypeConverter;
51
52    #[test]
53    fn asset_id() {
54        let elements_asset_id = elements::AssetId::default();
55        let asset_id: AssetId = elements_asset_id.into();
56        assert_eq!(
57            <AssetId as UniffiCustomTypeConverter>::into_custom(
58                UniffiCustomTypeConverter::from_custom(asset_id)
59            )
60            .unwrap(),
61            asset_id
62        );
63    }
64}