use crate::DocumentCollection;
use crate::{QldbResult, QueryBuilder};
use std::convert::TryInto;
#[derive(Debug)]
pub struct Cursor {
query_builder: QueryBuilder,
next_page: Option<String>,
is_first_page: bool,
}
impl Cursor {
pub(crate) fn new(query_builder: QueryBuilder) -> Cursor {
Cursor {
query_builder,
next_page: None,
is_first_page: true,
}
}
pub async fn load_more(&mut self) -> QldbResult<Option<DocumentCollection>> {
let (values, next_page_token) = if self.is_first_page {
self.query_builder.execute_statement().await?
} else if let Some(page) = &self.next_page {
self.query_builder.execute_get_page(page).await?
} else {
self.is_first_page = false;
return Ok(None);
};
self.is_first_page = false;
self.next_page = next_page_token;
Ok(Some(values.try_into()?))
}
pub async fn load_all(mut self) -> QldbResult<DocumentCollection> {
let mut result = DocumentCollection::new(vec![]);
while let Some(values) = self.load_more().await? {
result.extend(values.into_iter());
if self.next_page.is_none() {
break;
}
}
Ok(result)
}
}