#[cfg(feature = "demo")]
use std::collections::HashMap;
#[cfg(feature = "demo")]
use std::sync::LazyLock;
#[derive(Debug, Clone, Copy)]
pub struct EmbeddedAsset {
pub content: &'static [u8],
pub content_type: &'static str,
pub encoding: AssetEncoding,
}
#[derive(Debug, Copy, Clone)]
pub enum AssetEncoding {
Gzip,
Identity,
}
#[cfg(feature = "demo")]
static ASSETS: LazyLock<HashMap<&'static str, EmbeddedAsset>> = LazyLock::new(|| {
#[allow(unused_mut)]
let mut m = HashMap::with_capacity(8);
#[cfg(all(not(docsrs), not(cargo_publish)))]
{
m.insert(
"/vendor/gridjs.min.js",
EmbeddedAsset {
content: include_bytes!("../../assets/vendor/gridjs.min.js.gz"),
content_type: "application/javascript",
encoding: AssetEncoding::Gzip,
},
);
m.insert(
"/vendor/gridjs-mermaid.min.css",
EmbeddedAsset {
content: include_bytes!("../../assets/vendor/gridjs-mermaid.min.css.gz"),
content_type: "text/css",
encoding: AssetEncoding::Gzip,
},
);
m.insert(
"/vendor/mermaid.min.js",
EmbeddedAsset {
content: include_bytes!("../../assets/vendor/mermaid.min.js.gz"),
content_type: "application/javascript",
encoding: AssetEncoding::Gzip,
},
);
m.insert(
"/vendor/d3.min.js",
EmbeddedAsset {
content: include_bytes!("../../assets/vendor/d3.min.js.gz"),
content_type: "application/javascript",
encoding: AssetEncoding::Gzip,
},
);
}
#[cfg(all(not(docsrs), not(cargo_publish)))]
{
m.insert(
"/demo.css",
EmbeddedAsset {
content: include_bytes!("../../assets/demo/style.min.css"),
content_type: "text/css",
encoding: AssetEncoding::Identity,
},
);
m.insert(
"/demo.js",
EmbeddedAsset {
content: include_bytes!("../../assets/demo/app.min.js"),
content_type: "application/javascript",
encoding: AssetEncoding::Identity,
},
);
m.insert(
"/favicon.ico",
EmbeddedAsset {
content: include_bytes!("../../assets/demo/favicon.ico"),
content_type: "image/x-icon",
encoding: AssetEncoding::Identity,
},
);
}
m
});
#[cfg(feature = "demo")]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn get_asset(path: &str) -> Option<&'static EmbeddedAsset> {
ASSETS.get(path)
}
#[cfg(not(feature = "demo"))]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn get_asset(_path: &str) -> Option<&'static EmbeddedAsset> {
None
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn decompress_asset(asset: &EmbeddedAsset) -> std::borrow::Cow<'static, [u8]> {
match asset.encoding {
AssetEncoding::Identity => std::borrow::Cow::Borrowed(asset.content),
AssetEncoding::Gzip => {
use flate2::read::GzDecoder;
use std::io::Read;
let mut decoder = GzDecoder::new(asset.content);
let mut decompressed = Vec::new();
decoder
.read_to_end(&mut decompressed)
.expect("Failed to decompress asset");
std::borrow::Cow::Owned(decompressed)
}
}
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn get_asset_hash() -> &'static str {
option_env!("ASSET_HASH").unwrap_or("development")
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
#[test]
fn test_assets_basic() {
assert_eq!(1 + 1, 2);
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}