use polyplug_utils::GuestContractId;
use crate::{
dispatch::{
dispatch_mechanisms::DispatchMechanisms, dispatch_type::DispatchType,
vm_loader_data::VmLoaderData,
},
guest::GuestContractInstance,
host::HostApi,
types::Version,
};
#[repr(C)]
#[derive(Clone, Copy)]
pub struct GuestContractInterface {
pub contract_id: GuestContractId,
pub contract_version: Version,
pub dispatch_type: DispatchType,
pub create_instance: unsafe extern "C" fn(
loader_data: VmLoaderData,
host: *const HostApi,
args: *const (),
out_instance: *mut GuestContractInstance,
),
pub destroy_instance: unsafe extern "C" fn(
loader_data: VmLoaderData,
host: *const HostApi,
instance: GuestContractInstance,
),
pub dispatch: DispatchMechanisms,
}
#[cfg(test)]
mod tests {
use super::GuestContractInterface;
use crate::host::HostApi;
use core::mem::{align_of, offset_of, size_of};
#[test]
fn layout_guest_contract_interface() {
assert_eq!(size_of::<GuestContractInterface>(), 56);
assert_eq!(align_of::<GuestContractInterface>(), 8);
assert_eq!(offset_of!(GuestContractInterface, contract_id), 0);
assert_eq!(offset_of!(GuestContractInterface, contract_version), 8);
assert_eq!(offset_of!(GuestContractInterface, dispatch_type), 20);
assert_eq!(offset_of!(GuestContractInterface, create_instance), 24);
assert_eq!(offset_of!(GuestContractInterface, destroy_instance), 32);
assert_eq!(offset_of!(GuestContractInterface, dispatch), 40);
}
#[test]
fn guest_contract_interface_uses_host_api() {
assert_eq!(size_of::<*const HostApi>(), 8);
}
}