use anyhow::{Context, Result};
use camino::Utf8Path;
use std::path::PathBuf;
fn main() -> Result<()> {
let lib_path: PathBuf = std::env::args()
.nth(1)
.map(PathBuf::from)
.unwrap_or_else(|| PathBuf::from("target/release/libcfait.so"));
println!("Inspecting UniFFI metadata in: {}", lib_path.display());
let lib_str = lib_path
.to_str()
.with_context(|| format!("Library path is not valid UTF-8: {}", lib_path.display()))?;
let lib_utf8 = Utf8Path::new(lib_str);
let lib_bytes = std::fs::read(&lib_path)
.with_context(|| format!("Failed to read library bytes from {}", lib_path.display()))?;
match uniffi_bindgen::macro_metadata::extract_from_bytes(&lib_bytes) {
Ok(items) => {
println!(
"Macro metadata extractor found {} item(s) in the library.",
items.len()
);
let mut md_groups = uniffi_meta::create_metadata_groups(&items);
if let Err(e) = uniffi_meta::group_metadata(&mut md_groups, items.clone()) {
eprintln!("Warning: grouping raw metadata returned an error: {:#}", e);
}
println!(
"Raw metadata groups discovered (crates): {:?}",
md_groups.keys().collect::<Vec<_>>()
);
}
Err(e) => {
eprintln!("Macro metadata extractor failed: {:#}", e);
}
}
let bindgen_paths = uniffi_bindgen::BindgenPaths::default();
let loader =
uniffi_bindgen::BindgenLoader::new(bindgen_paths, uniffi_bindgen::GlobalConfig::default());
let metadata = loader
.load_metadata(lib_utf8)
.with_context(|| format!("Failed to load metadata from {}", lib_path.display()))?;
println!(
"Loader discovered metadata for crates: {:?}",
metadata.keys().collect::<Vec<_>>()
);
let cis = loader
.load_cis(metadata)
.with_context(|| "Failed to convert metadata into ComponentInterface instances")?;
println!("Found {} ComponentInterface(s)", cis.len());
for ci in &cis {
println!(
"ci crate_name='{}' namespace='{}'",
ci.crate_name(),
ci.namespace()
);
}
println!();
println!("Done.");
Ok(())
}