use candid::{CandidType, Principal, decode_one, encode_args, utils::ArgumentEncoder};
use canic::Error;
use serde::de::DeserializeOwned;
use super::Pic;
impl Pic {
pub fn update_call<T, A>(
&self,
canister_id: Principal,
method: &str,
args: A,
) -> Result<T, Error>
where
T: CandidType + DeserializeOwned,
A: ArgumentEncoder,
{
let bytes: Vec<u8> = encode_args(args)
.map_err(|err| Error::internal(format!("encode_args failed: {err}")))?;
let result = self
.inner
.update_call(canister_id, Principal::anonymous(), method, bytes)
.map_err(|err| {
Error::internal(format!(
"pocket_ic update_call failed (canister={canister_id}, method={method}): {err}"
))
})?;
decode_one(&result).map_err(|err| Error::internal(format!("decode_one failed: {err}")))
}
pub fn update_call_as<T, A>(
&self,
canister_id: Principal,
caller: Principal,
method: &str,
args: A,
) -> Result<T, Error>
where
T: CandidType + DeserializeOwned,
A: ArgumentEncoder,
{
let bytes: Vec<u8> = encode_args(args)
.map_err(|err| Error::internal(format!("encode_args failed: {err}")))?;
let result = self
.inner
.update_call(canister_id, caller, method, bytes)
.map_err(|err| {
Error::internal(format!(
"pocket_ic update_call failed (canister={canister_id}, method={method}): {err}"
))
})?;
decode_one(&result).map_err(|err| Error::internal(format!("decode_one failed: {err}")))
}
pub fn query_call<T, A>(
&self,
canister_id: Principal,
method: &str,
args: A,
) -> Result<T, Error>
where
T: CandidType + DeserializeOwned,
A: ArgumentEncoder,
{
let bytes: Vec<u8> = encode_args(args)
.map_err(|err| Error::internal(format!("encode_args failed: {err}")))?;
let result = self
.inner
.query_call(canister_id, Principal::anonymous(), method, bytes)
.map_err(|err| {
Error::internal(format!(
"pocket_ic query_call failed (canister={canister_id}, method={method}): {err}"
))
})?;
decode_one(&result).map_err(|err| Error::internal(format!("decode_one failed: {err}")))
}
pub fn query_call_as<T, A>(
&self,
canister_id: Principal,
caller: Principal,
method: &str,
args: A,
) -> Result<T, Error>
where
T: CandidType + DeserializeOwned,
A: ArgumentEncoder,
{
let bytes: Vec<u8> = encode_args(args)
.map_err(|err| Error::internal(format!("encode_args failed: {err}")))?;
let result = self
.inner
.query_call(canister_id, caller, method, bytes)
.map_err(|err| {
Error::internal(format!(
"pocket_ic query_call failed (canister={canister_id}, method={method}): {err}"
))
})?;
decode_one(&result).map_err(|err| Error::internal(format!("decode_one failed: {err}")))
}
pub fn tick_n(&self, times: usize) {
for _ in 0..times {
self.tick();
}
}
}