use crate::fs::{create_dir_all, PathExtra};
use crate::wasm_metadata::{AddMetadata, AddMetadataField};
use anyhow::Context;
use std::fs;
use std::path::Path;
use wit_parser::PackageName;
#[allow(clippy::field_reassign_with_default)]
pub fn add_metadata(
source: &impl AsRef<Path>,
root_package_name: PackageName,
target: &impl AsRef<Path>,
) -> anyhow::Result<()> {
let wasm = fs::read(source)
.with_context(|| format!("Reading linked WASM from {:?}", source.as_ref()))?;
let mut metadata = AddMetadata::default();
metadata.name = AddMetadataField::Set(format!(
"{}:{}",
root_package_name.namespace, root_package_name.name
));
metadata.version = match &root_package_name.version {
None => AddMetadataField::Clear,
Some(v) => AddMetadataField::Set(crate::wasm_metadata::Version::new(v.to_string())),
};
let updated_wasm = metadata
.to_wasm(&wasm)
.context("Adding name and version metadata to the linked WASM")?;
create_dir_all(PathExtra::new(target).parent()?)
.with_context(|| format!("Failed to create target dir for {:?}", target.as_ref()))?;
fs::write(target, &updated_wasm)
.with_context(|| format!("Writing final linked WASM to {:?}", target.as_ref()))?;
Ok(())
}