use anyhow::Result;
use std::{
fs,
path::Path,
};
use toml::value;
pub(super) fn generate_package<P: AsRef<Path>>(
target_dir: P,
contract_package_name: &str,
mut ink_metadata_dependency: value::Table,
) -> Result<()> {
let dir = target_dir.as_ref();
tracing::debug!(
"Generating metadata package for {} in {}",
contract_package_name,
dir.display()
);
let cargo_toml = include_str!("../../templates/tools/generate-metadata/_Cargo.toml");
let main_rs = include_str!("../../templates/tools/generate-metadata/main.rs");
let mut cargo_toml: value::Table = toml::from_str(cargo_toml)?;
let deps = cargo_toml
.get_mut("dependencies")
.expect("[dependencies] section specified in the template")
.as_table_mut()
.expect("[dependencies] is a table specified in the template");
let contract = deps
.get_mut("contract")
.expect("contract dependency specified in the template")
.as_table_mut()
.expect("contract dependency is a table specified in the template");
contract.insert("package".into(), contract_package_name.into());
ink_metadata_dependency.remove("default-features");
ink_metadata_dependency.remove("features");
ink_metadata_dependency.remove("optional");
deps.insert("ink_metadata".into(), ink_metadata_dependency.into());
let cargo_toml = toml::to_string(&cargo_toml)?;
fs::write(dir.join("Cargo.toml"), cargo_toml)?;
fs::write(dir.join("main.rs"), main_rs)?;
Ok(())
}