1use flate2::write::DeflateEncoder;
2use flate2::bufread::DeflateDecoder;
3use std::io::Read;
4use flate2::Compression;
5use rkyv::ser::serializers::AllocSerializer;
6use rkyv::{ser::Serializer, AlignedVec, Archive, Deserialize, Serialize};
7use std::io::Write;
8use std::sync::Arc;
9
10#[derive(thiserror::Error, Debug)]
11pub enum DeserializeError {
12 #[error("rykv deserialization error {0:?}")]
13 SharedDeserializeMapError(#[from] rkyv::de::deserializers::SharedDeserializeMapError),
14 #[error("decode error {0:?}")]
15 CheckTypeError(#[from] rkyv::validation::validators::DefaultValidatorError),
16}
17
18#[derive(Archive, Debug, Deserialize, Serialize, PartialEq, PartialOrd)]
19#[archive(check_bytes)]
20#[archive_attr(derive(Debug))]
21pub struct Asset {
22 pub path: Arc<str>,
23 pub mime: Arc<str>,
24 pub bytes: Arc<[u8]>,
25}
26
27#[derive(Archive, Debug, Deserialize, Serialize, PartialEq, PartialOrd)]
28#[archive(check_bytes)]
29#[archive_attr(derive(Debug))]
30pub struct Locale {
31 pub lang: Arc<str>,
32 pub bytes: Arc<[u8]>,
33}
34
35#[derive(Archive, Debug, Deserialize, Serialize, PartialEq, PartialOrd)]
36#[archive(check_bytes)]
37#[archive_attr(derive(Debug))]
38pub struct WebComponent {
39 pub id: Arc<str>,
40 pub name: Arc<str>,
41 pub path: Arc<str>,
42 pub locales: Arc<[Locale]>,
43 pub locales_metadata: Option<Arc<[u8]>>,
44}
45
46#[derive(Archive, Debug, Deserialize, Serialize, PartialEq, PartialOrd)]
47#[archive(check_bytes)]
48#[archive_attr(derive(Debug))]
49pub struct AssetPackage {
50 pub name: Arc<str>,
51 pub index: i64,
52 pub version: Arc<str>,
53 pub target_url: Arc<str>,
54 pub assets: Arc<[Arc<Asset>]>,
55 pub created: i64,
56 pub updated: i64,
57 pub web_components: Arc<[WebComponent]>,
58}
59
60pub fn serialize(pkg: AssetPackage) -> AlignedVec {
61 let mut serializer = AllocSerializer::<0>::default();
62 serializer.serialize_value(&pkg).unwrap();
63 serializer.into_serializer().into_inner()
64}
65
66pub fn deserialize(data: &[u8]) -> anyhow::Result<AssetPackage> {
67 let archived = rkyv::check_archived_root::<AssetPackage>(data)
68 .map_err(|err| anyhow::anyhow!("{err:#?}"))?;
69 let result =
70 archived.deserialize(&mut rkyv::de::deserializers::SharedDeserializeMap::default())?;
71 Ok(result)
72}
73
74pub fn deflate_encode_raw(base_raw: &[u8]) -> Vec<u8> {
75 let mut e = DeflateEncoder::new(Vec::new(), Compression::default());
76 e.write_all(base_raw).unwrap();
77 let compressed_bytes = e.finish();
78 compressed_bytes.unwrap()
79}
80
81pub fn deflate_decode_raw(base_compressed: &[u8]) -> Vec<u8> {
82 let mut d = DeflateDecoder::new(base_compressed);
83 let mut buffer = Vec::new();
84 d.read_to_end(&mut buffer).unwrap();
85 buffer
86}