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}