use alloc::vec::Vec;
use miden_core::{
Felt,
utils::{Deserializable, Serializable},
};
use miden_processor::Digest;
use super::{AccountCode, build_procedure_commitment, procedures_as_elements};
use crate::account::AccountProcedureInfo;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct AccountCodeHeader {
commitment: Digest,
procedures: Vec<AccountProcedureInfo>,
}
impl AccountCodeHeader {
pub fn new(procedures: Vec<AccountProcedureInfo>) -> Self {
let commitment = build_procedure_commitment(&procedures);
AccountCodeHeader { procedures, commitment }
}
pub fn commitment(&self) -> Digest {
self.commitment
}
pub fn procedures(&self) -> &[AccountProcedureInfo] {
&self.procedures
}
pub fn as_elements(&self) -> Vec<Felt> {
procedures_as_elements(&self.procedures)
}
}
impl From<AccountCode> for AccountCodeHeader {
fn from(value: AccountCode) -> Self {
AccountCodeHeader::new(value.procedures)
}
}
impl Serializable for AccountCodeHeader {
fn write_into<W: miden_core::utils::ByteWriter>(&self, target: &mut W) {
target.write(&self.procedures);
}
}
impl Deserializable for AccountCodeHeader {
fn read_from<R: miden_core::utils::ByteReader>(
source: &mut R,
) -> Result<Self, miden_processor::DeserializationError> {
let procedures: Vec<AccountProcedureInfo> = source.read()?;
let commitment = build_procedure_commitment(&procedures);
Ok(AccountCodeHeader { procedures, commitment })
}
}