sui_adapter_v0/
type_layout_resolver.rsuse crate::programmable_transactions::context::new_session_for_linkage;
use crate::programmable_transactions::{
context::load_type,
linkage_view::{LinkageInfo, LinkageView},
};
use move_core_types::account_address::AccountAddress;
use move_core_types::annotated_value as A;
use move_core_types::language_storage::{StructTag, TypeTag};
use move_core_types::resolver::ResourceResolver;
use move_vm_runtime::{move_vm::MoveVM, session::Session};
use sui_types::base_types::ObjectID;
use sui_types::error::SuiResult;
use sui_types::execution::TypeLayoutStore;
use sui_types::storage::{BackingPackageStore, PackageObject};
use sui_types::{error::SuiError, layout_resolver::LayoutResolver};
pub struct TypeLayoutResolver<'state, 'vm> {
session: Session<'state, 'vm, LinkageView<'state>>,
}
struct NullSuiResolver<'state>(Box<dyn TypeLayoutStore + 'state>);
impl<'state, 'vm> TypeLayoutResolver<'state, 'vm> {
pub fn new(vm: &'vm MoveVM, state_view: Box<dyn TypeLayoutStore + 'state>) -> Self {
let session = new_session_for_linkage(
vm,
LinkageView::new(Box::new(NullSuiResolver(state_view)), LinkageInfo::Unset),
);
Self { session }
}
}
impl LayoutResolver for TypeLayoutResolver<'_, '_> {
fn get_annotated_layout(
&mut self,
struct_tag: &StructTag,
) -> Result<A::MoveDatatypeLayout, SuiError> {
let type_tag: TypeTag = TypeTag::from(struct_tag.clone());
let Ok(ty) = load_type(&mut self.session, &type_tag) else {
return Err(SuiError::FailObjectLayout {
st: format!("{}", struct_tag),
});
};
let layout = self.session.type_to_fully_annotated_layout(&ty);
let Ok(A::MoveTypeLayout::Struct(layout)) = layout else {
return Err(SuiError::FailObjectLayout {
st: format!("{}", struct_tag),
});
};
Ok(A::MoveDatatypeLayout::Struct(layout))
}
}
impl BackingPackageStore for NullSuiResolver<'_> {
fn get_package_object(&self, package_id: &ObjectID) -> SuiResult<Option<PackageObject>> {
self.0.get_package_object(package_id)
}
}
impl ResourceResolver for NullSuiResolver<'_> {
type Error = SuiError;
fn get_resource(
&self,
_address: &AccountAddress,
_typ: &StructTag,
) -> Result<Option<Vec<u8>>, Self::Error> {
Ok(None)
}
}