use anyhow::Result;
use borsh::BorshDeserialize;
use sdk::{BlobIndex, BlobTransaction, StructuredBlob, TxContext};
pub struct LightExecutorOutput {
pub success: bool,
pub program_outputs: Vec<u8>,
}
pub trait LightContractExecutor<'tx, 'extra_data> {
type Scratchpad;
type ExtraData;
fn prepare_for_tx(
&mut self,
tx: &'tx BlobTransaction,
index: BlobIndex,
tx_ctx: Option<&'tx TxContext>,
extra_data: Self::ExtraData,
) -> Result<Self::Scratchpad>;
fn handle_blob(
&mut self,
tx: &'tx BlobTransaction,
index: BlobIndex,
tx_ctx: Option<&'tx TxContext>,
extra_data: Self::ExtraData,
) -> Result<LightExecutorOutput>;
fn on_failure(&mut self, scratchpad: Self::Scratchpad) -> Result<()>;
fn on_success(&mut self, scratchpad: Self::Scratchpad) -> Result<()>;
}
pub fn parse_structured_blob_from_tx<Action>(
tx: &BlobTransaction,
index: BlobIndex,
) -> Option<StructuredBlob<Action>>
where
Action: BorshDeserialize,
{
let blob = match tx.blobs.get(index.0) {
Some(v) => v,
None => {
return None;
}
};
let parsed_blob: StructuredBlob<Action> = match StructuredBlob::try_from(blob.clone()) {
Ok(v) => v,
Err(_) => {
return None;
}
};
Some(parsed_blob)
}