spore_types/
lib.rs

1#![no_std]
2
3extern crate alloc;
4pub use crate::generated::spore::{Bytes, BytesOpt, SporeData};
5use alloc::string::String;
6use alloc::vec::Vec;
7use molecule::prelude::{Builder, Entity};
8
9pub mod generated;
10
11impl Into<Bytes> for &[u8] {
12    fn into(self) -> Bytes {
13        let len = self.len();
14        let mut vec: Vec<u8> = Vec::with_capacity(4 + len);
15        vec.extend_from_slice(&(len as u32).to_le_bytes()[..]);
16        vec.extend_from_slice(self);
17        Bytes::new_unchecked(Bytes::from_slice(vec.as_slice()).unwrap().as_bytes())
18    }
19}
20
21impl Into<BytesOpt> for &[u8] {
22    fn into(self) -> BytesOpt {
23        let len = self.len();
24        let mut vec: Vec<u8> = Vec::with_capacity(4 + len);
25        vec.extend_from_slice(&(len as u32).to_le_bytes()[..]);
26        vec.extend_from_slice(self);
27        BytesOpt::new_unchecked(BytesOpt::from_slice(vec.as_slice()).unwrap().as_bytes())
28    }
29}
30
31#[derive(Debug, Clone)]
32pub struct NativeNFTData {
33    pub content_type: String,
34    pub content: Vec<u8>,
35    pub cluster_id: Option<Vec<u8>>,
36}
37
38impl From<NativeNFTData> for generated::spore::SporeData {
39    fn from(data: NativeNFTData) -> Self {
40        let content: Bytes = data.content.as_slice().into();
41        let content_type: Bytes = data.content_type.as_bytes().into();
42        let cluster_id = match data.cluster_id {
43            Some(cluster) => BytesOpt::new_builder()
44                .set(Some(cluster.as_slice().into()))
45                .build(),
46            None => BytesOpt::default(),
47        };
48        SporeData::new_builder()
49            .content(content)
50            .content_type(content_type)
51            .cluster_id(cluster_id)
52            .build()
53    }
54}
55
56impl generated::spore::Bytes {
57    pub fn unpack(&self) -> &[u8] {
58        &self.as_slice()[4..]
59    }
60}