use alloc::vec::Vec;
use crate::Felt;
use crate::account::AccountCode;
use crate::utils::serde::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
Serializable,
};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct AccountCodePatch {
patch: Option<AccountCode>,
}
impl AccountCodePatch {
const DOMAIN: Felt = Felt::from_u8(4);
pub fn new(code: Option<AccountCode>) -> Self {
Self { patch: code }
}
pub fn is_empty(&self) -> bool {
self.patch.is_none()
}
pub fn as_code(&self) -> Option<&AccountCode> {
self.patch.as_ref()
}
pub fn into_code(self) -> Option<AccountCode> {
self.patch
}
pub fn merge(&mut self, other: Self) {
if other.patch.is_some() {
self.patch = other.patch;
}
}
pub(in crate::account) fn append_patch_elements(&self, elements: &mut Vec<Felt>) {
if let Some(code) = &self.patch {
elements.extend_from_slice(&[Self::DOMAIN, Felt::ZERO, Felt::ZERO, Felt::ZERO]);
elements.extend_from_slice(code.commitment().as_elements());
}
}
}
impl Serializable for AccountCodePatch {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.patch.write_into(target);
}
fn get_size_hint(&self) -> usize {
self.patch.get_size_hint()
}
}
impl Deserializable for AccountCodePatch {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
<Option<AccountCode>>::read_from(source).map(Self::new)
}
}