use super::{NoteAssets, NoteId, NoteRecipient, NoteScript, NoteStorage, Nullifier};
use crate::Word;
use crate::utils::serde::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
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 storage(&self) -> &NoteStorage {
self.recipient.storage()
}
pub fn recipient(&self) -> &NoteRecipient {
&self.recipient
}
pub fn nullifier(&self) -> Nullifier {
Nullifier::from(self)
}
pub fn minify_script(&mut self) {
self.recipient.minify_script();
}
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);
}
fn get_size_hint(&self) -> usize {
self.assets.get_size_hint() + self.recipient.get_size_hint()
}
}
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))
}
}