use miden_processor::DeserializationError;
use super::{NoteAssets, NoteId, NoteInputs, NoteRecipient, NoteScript, Nullifier};
use crate::Word;
use crate::utils::serde::{ByteReader, ByteWriter, Deserializable, Serializable};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct NoteDetails {
assets: NoteAssets,
recipient: NoteRecipient,
}
impl NoteDetails {
pub fn new(assets: NoteAssets, recipient: NoteRecipient) -> Self {
Self { assets, recipient }
}
pub fn id(&self) -> NoteId {
NoteId::from(self)
}
pub fn assets(&self) -> &NoteAssets {
&self.assets
}
pub fn serial_num(&self) -> Word {
self.recipient.serial_num()
}
pub fn script(&self) -> &NoteScript {
self.recipient.script()
}
pub fn inputs(&self) -> &NoteInputs {
self.recipient.inputs()
}
pub fn recipient(&self) -> &NoteRecipient {
&self.recipient
}
pub fn nullifier(&self) -> Nullifier {
Nullifier::from(self)
}
pub fn into_parts(self) -> (NoteAssets, NoteRecipient) {
(self.assets, self.recipient)
}
}
impl AsRef<NoteRecipient> for NoteDetails {
fn as_ref(&self) -> &NoteRecipient {
self.recipient()
}
}
impl Serializable for NoteDetails {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
let Self { assets, recipient } = self;
assets.write_into(target);
recipient.write_into(target);
}
}
impl Deserializable for NoteDetails {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let assets = NoteAssets::read_from(source)?;
let recipient = NoteRecipient::read_from(source)?;
Ok(Self::new(assets, recipient))
}
}