use alloc::vec::Vec;
use js_export_macro::js_export;
use miden_client::block::BlockNumber;
use miden_client::rpc::domain::note::NoteSyncBlock as NativeNoteSyncBlock;
use super::block_header::BlockHeader;
use super::committed_note::CommittedNote;
use super::merkle_path::MerklePath;
#[js_export]
pub struct NoteSyncBlock(NativeNoteSyncBlock);
#[js_export]
impl NoteSyncBlock {
#[js_export(js_name = "blockHeader")]
pub fn block_header(&self) -> BlockHeader {
self.0.block_header.clone().into()
}
#[js_export(js_name = "mmrPath")]
pub fn mmr_path(&self) -> MerklePath {
self.0.mmr_path.clone().into()
}
pub fn notes(&self) -> Vec<CommittedNote> {
self.0.notes.values().map(Into::into).collect()
}
}
impl From<NativeNoteSyncBlock> for NoteSyncBlock {
fn from(native: NativeNoteSyncBlock) -> Self {
NoteSyncBlock(native)
}
}
#[js_export]
pub struct NoteSyncInfo {
blocks: Vec<NativeNoteSyncBlock>,
block_to: BlockNumber,
}
impl NoteSyncInfo {
pub fn new(blocks: Vec<NativeNoteSyncBlock>, block_to: BlockNumber) -> Self {
Self { blocks, block_to }
}
}
#[js_export]
impl NoteSyncInfo {
#[js_export(js_name = "blockTo")]
pub fn block_to(&self) -> u32 {
self.block_to.as_u32()
}
#[js_export(js_name = "blockHeader")]
pub fn block_header(&self) -> Option<BlockHeader> {
self.blocks.first().map(|block| block.block_header.clone().into())
}
#[js_export(js_name = "mmrPath")]
pub fn mmr_path(&self) -> Option<MerklePath> {
self.blocks.first().map(|block| block.mmr_path.clone().into())
}
pub fn notes(&self) -> Vec<CommittedNote> {
self.blocks
.iter()
.flat_map(|block| block.notes.values().cloned())
.map(Into::into)
.collect()
}
pub fn blocks(&self) -> Vec<NoteSyncBlock> {
self.blocks.iter().cloned().map(NoteSyncBlock).collect()
}
}