#[doc(hidden)]
pub fn __decode_embedded_signed_license_aes(
encrypted_b64: &str,
key: &str,
) -> crate::SignedLicense {
use base64::Engine as _;
let value = base64::prelude::BASE64_STANDARD
.decode(encrypted_b64.as_bytes())
.expect("invalid embedded base64 in signed license");
let cryptor =
byte_aes::Aes256Cryptor::try_from(key).expect("invalid AES key for signed license");
let decoded_data = cryptor
.decrypt(value)
.expect("failed to decrypt embedded signed license");
crate::SignedLicense::from(
String::from_utf8(decoded_data).expect("embedded signed license is not valid UTF-8"),
)
}
#[macro_export]
#[doc(hidden)]
macro_rules! human_bytes {
($bytes:expr) => {{
let bytes: u64 = $bytes as u64;
const UNITS: [&str; 5] = ["B", "KB", "MB", "GB", "TB"];
let mut size = bytes as f64;
let mut unit = 0;
while size >= 1024.0 && unit < UNITS.len() - 1 {
size /= 1024.0;
unit += 1;
}
if unit == 0 {
format!("{} {}", size as u64, UNITS[unit])
} else {
format!("{:.2} {}", size, UNITS[unit])
}
}};
}
#[macro_export]
macro_rules! pack_items {
(
$(
$path:expr => $bytes:expr
$(; ext=$ext:expr)?
$(; type=$type_path:expr)?
),* $(,)?
) => {{
let mut v = Vec::new();
$(
let mut item = $crate::PackItem::new($path, $bytes).expect("forbidden extension or invalid dlcpack content");
$( item = item.with_extension($ext).expect("forbidden extension"); )?
$( item = item.with_type_path($type_path); )?
v.push(item);
)*
v
}};
}
#[macro_export]
macro_rules! dlc_register_types {
($app:expr, $($ty:ty),* $(,)?) => {{
$(
$app.register_dlc_type::<$ty>();
)*
}};
}
#[macro_export]
macro_rules! dlc_simple_asset {
($name:ident, $loader:ident, $plugin:ident, $($ext:expr),+ $(,)?) => {
#[derive(bevy::asset::Asset, bevy::reflect::Reflect, serde::Serialize, serde::Deserialize)]
pub struct $name(pub String);
#[derive(Default, bevy::reflect::Reflect)]
pub struct $loader;
impl bevy::asset::AssetLoader for $loader {
type Asset = $name;
type Settings = ();
type Error = std::io::Error;
async fn load(
&self,
reader: &mut dyn bevy::asset::io::Reader,
_settings: &(),
_load_context: &mut bevy::asset::LoadContext<'_>,
) -> Result<Self::Asset, Self::Error> {
let mut bytes = Vec::new();
reader.read_to_end(&mut bytes).await?;
let s = String::from_utf8(bytes)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
Ok($name(s))
}
fn extensions(&self) -> &[&str] {
static EXTS: &[&str] = &[$($ext),+];
EXTS
}
}
pub struct $plugin;
impl bevy::prelude::Plugin for $plugin {
fn build(&self, app: &mut bevy::prelude::App) {
app.init_asset_loader::<$loader>();
$crate::AppExt::register_dlc_type::<$name>(app);
}
}
impl Default for $plugin {
fn default() -> Self {
$plugin
}
}
};
}
#[macro_export]
macro_rules! include_dlc_key_and_license_aes {
($pubkey_path:expr, $license_path:expr, $license_key:expr $(,)?) => {{
let signed_license = $crate::include_signed_license_aes!($license_path, $license_key);
let dlc_key =
$crate::DlcKey::public(include_str!($pubkey_path)).expect("invalid dlc pubkey");
(dlc_key, signed_license)
}};
}