use fvm_ipld_encoding::ipld_block::IpldBlock;
#[cfg(feature = "use_sdk")]
use fvm_sdk::send;
use fvm_shared::{address::Address, econ::TokenAmount, error::ErrorNumber, Response};
use thiserror::Error;
use crate::hash::{Hasher, MethodNameErr, MethodResolver};
#[derive(Default)]
pub struct MethodMessenger<T: Hasher> {
method_resolver: MethodResolver<T>,
}
#[derive(Error, PartialEq, Eq, Debug)]
pub enum MethodMessengerError {
#[error("error when calculating method name: `{0}`")]
MethodName(#[from] MethodNameErr),
#[error("error sending message: `{0}`")]
Syscall(#[from] ErrorNumber),
}
impl<T: Hasher> MethodMessenger<T> {
pub fn new(hasher: T) -> Self {
Self {
method_resolver: MethodResolver::new(hasher),
}
}
#[cfg(feature = "use_sdk")]
pub fn call_method(
&self,
to: &Address,
method: &str,
params: Option<IpldBlock>,
value: TokenAmount,
) -> Result<Response, MethodMessengerError> {
let method = self.method_resolver.method_number(method)?;
send::send(
to,
method,
params,
value,
None,
fvm_shared::sys::SendFlags::empty(),
)
.map_err(MethodMessengerError::from)
}
#[cfg(not(feature = "use_sdk"))]
#[allow(unused_variables)]
pub fn call_method(
&self,
to: &Address,
method: &str,
params: Option<IpldBlock>,
value: TokenAmount,
) -> Result<Response, MethodMessengerError> {
let _method = self.method_resolver.method_number(method)?;
unimplemented!()
}
}