use core::ops::Deref;
use soroban_sdk::{vec, Address, Bytes, Env, IntoVal, Symbol};
use crate::error::VerifyError;
use crate::payload::{parse_payload, Update};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct VerifiedPayload(Update);
impl VerifiedPayload {
pub fn into_inner(self) -> Update {
self.0
}
}
impl Deref for VerifiedPayload {
type Target = Update;
fn deref(&self) -> &Self::Target {
&self.0
}
}
pub struct PythLazerClient<'a> {
env: &'a Env,
address: Address,
}
impl<'a> PythLazerClient<'a> {
pub fn new(env: &'a Env, address: &Address) -> Self {
Self {
env,
address: address.clone(),
}
}
pub fn verify_update(&self, data: &Bytes) -> Result<VerifiedPayload, VerifyError> {
let call = self.env.try_invoke_contract::<Bytes, VerifyError>(
&self.address,
&Symbol::new(self.env, "verify_update"),
vec![self.env, data.into_val(self.env)],
);
let verified = match call {
Ok(Ok(bytes)) => bytes,
Err(Ok(err)) => return Err(err),
Ok(Err(_)) | Err(Err(_)) => return Err(VerifyError::InvokeFailed),
};
parse_payload(&verified)
.map(VerifiedPayload)
.map_err(VerifyError::from)
}
}