1#![no_std]
2extern crate alloc;
3pub use crate::generated::ckbfs::{Bytes, CKBFSData};
4use alloc::{string::String, vec::Vec};
5
6use generated::ckbfs::{Byte32, Uint32};
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
21
22#[derive(Debug, Clone)]
23pub struct CKBFSDataNative {
24 pub index: u32,
25 pub checksum: u32,
26 pub content_type: String,
27 pub filename: String,
28}
29
30impl From<CKBFSDataNative> for CKBFSData {
31 fn from(data: CKBFSDataNative) -> Self {
32 let content_type = data.content_type.as_bytes().into();
33 let filename = data.filename.as_bytes().into();
34 let index =
35 Uint32::new_unchecked(molecule::bytes::Bytes::from(
36 data.index.to_le_bytes().to_vec(),
37 ));
38 CKBFSData::new_builder()
39 .index(index)
40 .checksum(Uint32::new_unchecked(molecule::bytes::Bytes::from(
41 data.checksum.to_le_bytes().to_vec(),
42 )))
43 .filename(filename)
44 .content_type(content_type)
45 .build()
46 }
47}
48
49impl Into<CKBFSDataNative> for CKBFSData {
50 fn into(self) -> CKBFSDataNative {
51 let content_type = String::from_utf8(self.content_type().as_slice().to_vec())
52 .expect("Failed to extract content-type");
53 let filename = String::from_utf8(self.filename().as_slice().to_vec())
54 .expect("Failed to extract filname");
55 let index = u32::from_le_bytes(self.index().as_slice().try_into().unwrap());
56 let checksum = u32::from_le_bytes(self.checksum().as_slice().try_into().unwrap());
57 CKBFSDataNative {
58 index,
59 checksum,
60 content_type,
61 filename,
62 }
63 }
64}