use hopper_runtime::error::ProgramError;
pub trait InstructionArgs<'a>: Sized {
fn parse(data: &'a [u8]) -> Result<Self, ProgramError>;
}
pub trait ValidateArgs {
fn validate(&self) -> Result<(), ProgramError>;
}
use super::phase::{ExecutionContext, ResolvedFrame, ValidatedFrame};
use hopper_runtime::{Address, ProgramResult};
impl<'a, T> ResolvedFrame<'a, T> {
#[inline]
pub fn validate_with_args<A, F>(
self,
args: &A,
f: F,
) -> Result<ValidatedFrame<'a, T>, ProgramError>
where
F: FnOnce(&T, &Address, &A) -> ProgramResult,
{
f(&self.resolved, self.program_id, args)?;
Ok(ValidatedFrame {
program_id: self.program_id,
accounts: self.accounts,
ix_data: self.ix_data,
mutable_borrows: self.mutable_borrows,
resolved: self.resolved,
})
}
}
impl<'a, T> ValidatedFrame<'a, T> {
#[inline]
pub fn execute_with_args<A, R, F>(mut self, args: &A, f: F) -> Result<R, ProgramError>
where
F: FnOnce(&mut ExecutionContext<'a, '_, T>, &A) -> Result<R, ProgramError>,
{
let mut ctx = ExecutionContext {
program_id: self.program_id,
accounts: self.accounts,
ix_data: self.ix_data,
mutable_borrows: &mut self.mutable_borrows,
resolved: &self.resolved,
};
f(&mut ctx, args)
}
}