use hopper_runtime::error::ProgramError;
use hopper_runtime::{AccountView, Address};
#[cfg(feature = "explain")]
use super::explain::ContextExplain;
pub trait HopperAccounts<'a>: Sized {
type Bumps: Default;
const ACCOUNT_COUNT: usize;
fn try_from_accounts(
program_id: &'a Address,
accounts: &'a [AccountView],
instruction_data: &'a [u8],
) -> Result<(Self, Self::Bumps), ProgramError>;
#[cfg(feature = "explain")]
fn context_schema() -> Option<&'static crate::accounts::explain::ContextSchema> {
None
}
}
pub struct HopperCtx<'a, T>
where
T: HopperAccounts<'a>,
{
pub accounts: T,
pub bumps: T::Bumps,
pub program_id: &'a Address,
pub instruction_data: &'a [u8],
pub remaining_accounts: &'a [AccountView],
}
impl<'a, T> HopperCtx<'a, T>
where
T: HopperAccounts<'a>,
{
#[inline]
pub fn emit_receipt(&self) -> Result<(), ProgramError> {
Ok(())
}
#[cfg(feature = "explain")]
#[inline]
pub fn explain(&self) -> ContextExplain {
ContextExplain::from_schema(T::context_schema())
}
#[cfg(feature = "explain")]
#[inline]
pub fn schema(&self) -> Option<&'static crate::accounts::explain::ContextSchema> {
T::context_schema()
}
#[inline]
pub fn new(
accounts: T,
bumps: T::Bumps,
program_id: &'a Address,
instruction_data: &'a [u8],
remaining_accounts: &'a [AccountView],
) -> Self {
Self {
accounts,
bumps,
program_id,
instruction_data,
remaining_accounts,
}
}
}