use crate::client::data_types::graph::{GraphEntryAddress, GraphError};
use crate::client::high_level::register::{
PublicKey, RegisterAddress, RegisterError, RegisterValue,
};
use crate::client::key_derivation::MainPubkey;
use crate::client::{Client, GetError};
#[derive(Clone)]
pub struct RegisterHistory {
client: Client,
register_owner: PublicKey,
current_iter: GraphEntryAddress,
}
impl RegisterHistory {
fn new(client: Client, register_owner: PublicKey, root: GraphEntryAddress) -> Self {
Self {
client,
register_owner,
current_iter: root,
}
}
pub async fn next(&mut self) -> Result<Option<RegisterValue>, RegisterError> {
let (entry, next_derivation) = match self
.client
.register_get_graph_entry_and_next_derivation_index(&self.current_iter)
.await
{
Ok(res) => res,
Err(RegisterError::GraphError(GraphError::GetError(GetError::RecordNotFound))) => {
return Ok(None);
}
Err(e) => return Err(e),
};
let next_entry_pk: PublicKey = MainPubkey::from(self.register_owner)
.derive_key(&next_derivation)
.into();
self.current_iter = GraphEntryAddress::new(next_entry_pk);
Ok(Some(entry.content))
}
pub async fn collect(&mut self) -> Result<Vec<RegisterValue>, RegisterError> {
let mut history_from_first = self.clone();
history_from_first.current_iter = GraphEntryAddress::new(self.register_owner);
let mut values = Vec::new();
while let Some(value) = history_from_first.next().await? {
values.push(value);
}
Ok(values)
}
}
impl Client {
pub fn register_history(&self, addr: &RegisterAddress) -> RegisterHistory {
let graph_entry_addr = addr.to_underlying_graph_root();
RegisterHistory::new(self.clone(), addr.owner(), graph_entry_addr)
}
}