ars_package/
lib.rs

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}