pub use const_serialize;
pub use const_serialize::{ConstStr, ConstVec, SerializeConst};
pub use const_serialize_07;
use const_serialize_07::ConstVec as ConstVec07;
use manganis_core::{
AndroidArtifactMetadata, AssetOptions, BundledAsset, SwiftPackageMetadata, SymbolData,
};
pub const fn copy_bytes<const N: usize>(bytes: &[u8]) -> [u8; N] {
let mut out = [0; N];
let mut i = 0;
while i < N {
out[i] = bytes[i];
i += 1;
}
out
}
pub const fn serialize_symbol_data(symbol_data: &SymbolData) -> ConstVec<u8, 4096> {
dx_macro_helpers::serialize_to_const_with_max_padded::<4096>(symbol_data)
}
pub const fn serialize_android_artifact(meta: &AndroidArtifactMetadata) -> ConstVec<u8, 4096> {
serialize_symbol_data(&SymbolData::AndroidArtifact(*meta))
}
pub const fn serialize_swift_package(meta: &SwiftPackageMetadata) -> ConstVec<u8, 4096> {
serialize_symbol_data(&SymbolData::SwiftPackage(*meta))
}
pub const fn create_bundled_asset(input_path: &str, asset_config: AssetOptions) -> BundledAsset {
BundledAsset::new(input_path, BundledAsset::PLACEHOLDER_HASH, asset_config)
}
#[deprecated(
note = "Relative asset!() paths are not supported. Use a path like `/assets/myfile.png` instead of `./assets/myfile.png`"
)]
pub const fn create_bundled_asset_relative(
input_path: &str,
asset_config: AssetOptions,
) -> BundledAsset {
create_bundled_asset(input_path, asset_config)
}
pub const fn serialize_asset(asset: &BundledAsset) -> ConstVec<u8, 4096> {
dx_macro_helpers::serialize_to_const_with_max_padded::<4096>(asset)
}
pub const fn serialize_asset_07(asset: &BundledAsset) -> ConstVec07<u8> {
dx_macro_helpers::serialize_to_const_with_layout_padded_07(asset)
}
pub const fn deserialize_asset(bytes: &[u8]) -> BundledAsset {
match const_serialize::deserialize_const!(BundledAsset, bytes) {
Some((_, asset)) => asset,
None => panic!("Failed to deserialize asset. This may be caused by a mismatch between your dioxus and dioxus-cli versions"),
}
}
pub mod dx_macro_helpers {
use const_serialize::{ConstVec, SerializeConst};
pub const fn serialize_to_const<T: SerializeConst>(
value: &T,
memory_layout_size: usize,
) -> ConstVec<u8> {
let data = ConstVec::new();
let mut data = const_serialize::serialize_const(value, data);
while data.len() < memory_layout_size {
data = data.push(0);
}
data
}
pub const fn serialize_to_const_with_max<const MAX_SIZE: usize>(
value: &impl SerializeConst,
memory_layout_size: usize,
) -> ConstVec<u8, MAX_SIZE> {
let serialized = const_serialize::serialize_const(value, ConstVec::new());
let mut data: ConstVec<u8, MAX_SIZE> = ConstVec::new_with_max_size();
data = data.extend(serialized.as_ref());
while data.len() < memory_layout_size {
data = data.push(0);
}
data
}
pub const fn serialize_to_const_with_max_padded<const MAX_SIZE: usize>(
value: &impl SerializeConst,
) -> ConstVec<u8, MAX_SIZE> {
let serialized = const_serialize::serialize_const(value, ConstVec::new());
let mut data: ConstVec<u8, MAX_SIZE> = ConstVec::new_with_max_size();
data = data.extend(serialized.as_ref());
while data.len() < MAX_SIZE {
data = data.push(0);
}
data
}
pub const fn serialize_to_const_with_layout_padded_07<T: const_serialize_07::SerializeConst>(
value: &T,
) -> const_serialize_07::ConstVec<u8> {
let data = const_serialize_07::ConstVec::new();
let mut data = const_serialize_07::serialize_const(value, data);
let target_size = if T::MEMORY_LAYOUT.size() > 1024 {
1024
} else {
T::MEMORY_LAYOUT.size()
};
while data.len() < target_size {
data = data.push(0);
}
data
}
}