use super::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
NoteAssets,
NoteAttachments,
NoteDetailsCommitment,
NoteHeader,
NoteId,
NoteMetadata,
PartialNoteMetadata,
Serializable,
};
use crate::Word;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PartialNote {
header: NoteHeader,
recipient_digest: Word,
assets: NoteAssets,
attachments: NoteAttachments,
}
impl PartialNote {
pub fn new(
partial_metadata: PartialNoteMetadata,
recipient_digest: Word,
assets: NoteAssets,
attachments: NoteAttachments,
) -> Self {
let details_commitment =
NoteDetailsCommitment::from_raw_commitments(recipient_digest, assets.commitment());
let metadata = NoteMetadata::new(partial_metadata, &attachments);
let header = NoteHeader::new(details_commitment, metadata);
Self {
header,
recipient_digest,
assets,
attachments,
}
}
pub fn id(&self) -> NoteId {
self.header.id()
}
pub fn details_commitment(&self) -> NoteDetailsCommitment {
self.header.details_commitment()
}
pub fn metadata(&self) -> &NoteMetadata {
self.header.metadata()
}
pub fn partial_metadata(&self) -> &PartialNoteMetadata {
self.header.metadata().partial_metadata()
}
pub fn recipient_digest(&self) -> Word {
self.recipient_digest
}
pub fn assets(&self) -> &NoteAssets {
&self.assets
}
pub fn attachments(&self) -> &NoteAttachments {
&self.attachments
}
pub fn header(&self) -> &NoteHeader {
&self.header
}
pub fn into_parts(self) -> (NoteAssets, NoteHeader, NoteAttachments) {
(self.assets, self.header, self.attachments)
}
}
impl Serializable for PartialNote {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.header().metadata().partial_metadata().write_into(target);
self.recipient_digest.write_into(target);
self.assets.write_into(target);
self.attachments.write_into(target);
}
fn get_size_hint(&self) -> usize {
self.partial_metadata().get_size_hint()
+ Word::SERIALIZED_SIZE
+ self.assets.get_size_hint()
+ self.attachments.get_size_hint()
}
}
impl Deserializable for PartialNote {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let partial_metadata = PartialNoteMetadata::read_from(source)?;
let recipient_digest = Word::read_from(source)?;
let assets = NoteAssets::read_from(source)?;
let attachments = NoteAttachments::read_from(source)?;
Ok(Self::new(partial_metadata, recipient_digest, assets, attachments))
}
}