use js_sys::Object;
use wasm_bindgen::JsValue;
use crate::{CursorDirection, Error, KeyCursor};
#[cfg(feature = "futures")]
#[cfg_attr(any(docsrs, feature = "doc"), doc(cfg(feature = "futures")))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ManagedKeyCursor {
inner: Option<KeyCursor>,
}
impl ManagedKeyCursor {
pub fn source(&self) -> Option<Object> {
self.inner.as_ref().map(|cursor| cursor.source())
}
pub fn direction(&self) -> Result<Option<CursorDirection>, Error> {
self.inner
.as_ref()
.map(|cursor| cursor.direction())
.transpose()
}
pub fn key(&self) -> Result<Option<JsValue>, Error> {
self.inner.as_ref().map(|cursor| cursor.key()).transpose()
}
pub fn primary_key(&self) -> Result<Option<JsValue>, Error> {
self.inner
.as_ref()
.map(|cursor| cursor.primary_key())
.transpose()
}
pub async fn advance(&mut self, count: u32) -> Result<(), Error> {
let new_inner = {
let inner = self.inner.as_ref().ok_or(Error::CursorFinished)?;
inner.advance(count)?.await?
};
self.inner = new_inner;
Ok(())
}
pub async fn next(&mut self, key: Option<&JsValue>) -> Result<(), Error> {
let new_inner = {
let inner = self.inner.as_ref().ok_or(Error::CursorFinished)?;
inner.next(key)?.await?
};
self.inner = new_inner;
Ok(())
}
pub async fn next_primary_key(
&mut self,
key: &JsValue,
primary_key: &JsValue,
) -> Result<(), Error> {
let new_inner = {
let inner = self.inner.as_ref().ok_or(Error::CursorFinished)?;
inner.next_primary_key(key, primary_key)?.await?
};
self.inner = new_inner;
Ok(())
}
pub async fn update(&self, value: &JsValue) -> Result<JsValue, Error> {
self.inner
.as_ref()
.ok_or(Error::CursorFinished)?
.update(value)?
.await
}
pub async fn delete(&self) -> Result<(), Error> {
self.inner
.as_ref()
.ok_or(Error::CursorFinished)?
.delete()?
.await
}
}
impl From<KeyCursor> for ManagedKeyCursor {
fn from(inner: KeyCursor) -> Self {
Self { inner: Some(inner) }
}
}