use alloc::vec::Vec;
use vm_core::{
Felt,
crypto::{hash::RpoDigest, merkle::MerklePath},
mast::MastNodeExt,
};
use crate::{ErrorContext, ExecutionError, ProcessState, Word};
mod inputs;
pub use inputs::AdviceInputs;
mod providers;
pub use providers::{MemAdviceProvider, RecAdviceProvider};
mod source;
pub use source::AdviceSource;
pub trait AdviceProvider: Sized {
fn pop_stack(
&mut self,
process: ProcessState,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<Felt, ExecutionError>;
fn pop_stack_word(
&mut self,
process: ProcessState,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<Word, ExecutionError>;
fn pop_stack_dword(
&mut self,
process: ProcessState,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<[Word; 2], ExecutionError>;
fn push_stack(
&mut self,
source: AdviceSource,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<(), ExecutionError>;
fn get_mapped_values(&self, key: &RpoDigest) -> Option<&[Felt]>;
fn insert_into_map(&mut self, key: Word, values: Vec<Felt>);
fn get_tree_node(
&self,
root: Word,
depth: &Felt,
index: &Felt,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<Word, ExecutionError>;
fn get_merkle_path(
&self,
root: Word,
depth: &Felt,
index: &Felt,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<MerklePath, ExecutionError>;
fn get_leaf_depth(
&self,
root: Word,
tree_depth: &Felt,
index: &Felt,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<u8, ExecutionError>;
fn update_merkle_node(
&mut self,
root: Word,
depth: &Felt,
index: &Felt,
value: Word,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<(MerklePath, Word), ExecutionError>;
fn merge_roots(
&mut self,
lhs: Word,
rhs: Word,
err_ctx: &ErrorContext<'_, impl MastNodeExt>,
) -> Result<Word, ExecutionError>;
}