use std::{path::PathBuf, sync::Arc};
use contract_metadata::ContractMetadata;
use contract_transcode::ContractMessageTranscoder;
use crate::{DrinkResult, Error};
#[derive(Clone)]
pub struct ContractBundle {
pub wasm: Vec<u8>,
pub transcoder: Arc<ContractMessageTranscoder>,
}
impl ContractBundle {
pub fn load<P>(path: P) -> DrinkResult<Self>
where
P: AsRef<std::path::Path>,
{
let metadata: ContractMetadata = ContractMetadata::load(&path).map_err(|e| {
Error::BundleLoadFailed(format!("Failed to load the contract file:\n{e:?}"))
})?;
let ink_metadata = serde_json::from_value(serde_json::Value::Object(metadata.abi))
.map_err(|e| {
Error::BundleLoadFailed(format!(
"Failed to parse metadata from the contract file:\n{e:?}"
))
})?;
let transcoder = Arc::new(ContractMessageTranscoder::new(ink_metadata));
let wasm = metadata
.source
.wasm
.ok_or(Error::BundleLoadFailed(
"Failed to get the WASM blob from the contract file".to_string(),
))?
.0;
Ok(Self { wasm, transcoder })
}
pub fn local(project_dir: &str, contract_file_name: String) -> Self {
let mut path = PathBuf::from(project_dir);
path.push("target");
path.push("ink");
path.push(contract_file_name);
Self::load(path).expect("Loading the local bundle failed")
}
}
#[macro_export]
macro_rules! local_contract_file {
() => {
drink::session::ContractBundle::local(
env!("CARGO_MANIFEST_DIR"),
env!("CARGO_CRATE_NAME").to_owned() + ".contract",
)
};
}