use anyhow::Context;
mod abi;
mod emit;
mod indices;
mod mem_layout;
#[cfg(test)]
mod tests;
use emit::build_adapter;
const TIER1_WORLD_WIT: &str = include_str!("../../wit/tier1/world.wit");
const COMMON_WORLD_WIT: &str = include_str!("../../wit/common/world.wit");
pub fn generate_tier1_adapter(
middleware_name: &str,
target_interface: &str,
middleware_interfaces: &[String],
splits_output_path: &str,
split_path: &str,
) -> anyhow::Result<String> {
let has_before = middleware_interfaces.iter().any(|i| i.contains("/before"));
let has_after = middleware_interfaces.iter().any(|i| i.contains("/after"));
let has_blocking = middleware_interfaces
.iter()
.any(|i| i.contains("/blocking"));
let split_bytes = std::fs::read(split_path)
.with_context(|| format!("Failed to read split at '{split_path}'"))?;
let bytes = build_adapter(
target_interface,
has_before,
has_after,
has_blocking,
&split_bytes,
COMMON_WORLD_WIT,
TIER1_WORLD_WIT,
)?;
let out_path = format!(
"{splits_output_path}/splicer_adapter_{}_{}.wasm",
sanitize_name(middleware_name),
sanitize_name(target_interface)
);
std::fs::write(&out_path, &bytes)
.with_context(|| format!("Failed to write adapter component to '{}'", out_path))?;
Ok(out_path)
}
fn sanitize_name(s: &str) -> String {
s.chars()
.map(|c| if c.is_alphanumeric() { c } else { '_' })
.collect()
}