use crate::{
account_address::AccountAddress,
language_storage::{ModuleId, StructTag},
};
use std::fmt::Debug;
pub trait ModuleResolver {
type Error: Debug;
fn get_module(&self, id: &ModuleId) -> Result<Option<Vec<u8>>, Self::Error>;
}
pub trait ResourceResolver {
type Error: Debug;
fn get_resource(
&self,
address: &AccountAddress,
typ: &StructTag,
) -> Result<Option<Vec<u8>>, Self::Error>;
}
pub trait MoveResolver:
ModuleResolver<Error = Self::Err> + ResourceResolver<Error = Self::Err>
{
type Err: Debug;
}
impl<E: Debug, T: ModuleResolver<Error = E> + ResourceResolver<Error = E> + ?Sized> MoveResolver
for T
{
type Err = E;
}
impl<T: ResourceResolver + ?Sized> ResourceResolver for &T {
type Error = T::Error;
fn get_resource(
&self,
address: &AccountAddress,
tag: &StructTag,
) -> Result<Option<Vec<u8>>, Self::Error> {
(**self).get_resource(address, tag)
}
}
impl<T: ModuleResolver + ?Sized> ModuleResolver for &T {
type Error = T::Error;
fn get_module(&self, module_id: &ModuleId) -> Result<Option<Vec<u8>>, Self::Error> {
(**self).get_module(module_id)
}
}