use std::sync::Arc;
use loro::{ContainerTrait, LoroResult, PeerID};
use crate::{
ContainerID, DiffEvent, LoroDoc, LoroValue, LoroValueLike, Subscriber, Subscription,
ValueOrContainer,
};
use super::{LoroCounter, LoroList, LoroMovableList, LoroText, LoroTree};
#[derive(Debug, Clone)]
pub struct LoroMap {
pub(crate) inner: loro::LoroMap,
}
impl LoroMap {
pub fn new() -> Self {
Self {
inner: loro::LoroMap::new(),
}
}
pub fn is_attached(&self) -> bool {
self.inner.is_attached()
}
pub fn get_attached(&self) -> Option<Arc<LoroMap>> {
self.inner
.get_attached()
.map(|x| Arc::new(LoroMap { inner: x }))
}
pub fn delete(&self, key: &str) -> LoroResult<()> {
self.inner.delete(key)
}
pub fn insert(&self, key: &str, value: Arc<dyn LoroValueLike>) -> LoroResult<()> {
self.inner.insert(key, value.as_loro_value())
}
pub fn len(&self) -> u32 {
self.inner.len() as u32
}
pub fn id(&self) -> ContainerID {
self.inner.id().into()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn get(&self, key: &str) -> Option<Arc<dyn ValueOrContainer>> {
self.inner
.get(key)
.map(|v| Arc::new(v) as Arc<dyn ValueOrContainer>)
}
pub fn get_or_create_text_container(
&self,
key: &str,
text: Arc<LoroText>,
) -> LoroResult<Arc<LoroText>> {
let c = self
.inner
.get_or_create_container(key, text.as_ref().clone().inner)?;
Ok(Arc::new(LoroText { inner: c }))
}
pub fn get_or_create_map_container(
&self,
key: &str,
map: Arc<LoroMap>,
) -> LoroResult<Arc<LoroMap>> {
let c = self
.inner
.get_or_create_container(key, map.as_ref().clone().inner)?;
Ok(Arc::new(LoroMap { inner: c }))
}
pub fn get_or_create_tree_container(
&self,
key: &str,
tree: Arc<LoroTree>,
) -> LoroResult<Arc<LoroTree>> {
let c = self
.inner
.get_or_create_container(key, tree.as_ref().clone().inner)?;
Ok(Arc::new(LoroTree { inner: c }))
}
pub fn get_or_create_list_container(
&self,
key: &str,
list: Arc<LoroList>,
) -> LoroResult<Arc<LoroList>> {
let c = self
.inner
.get_or_create_container(key, list.as_ref().clone().inner)?;
Ok(Arc::new(LoroList { inner: c }))
}
pub fn get_or_create_movable_list_container(
&self,
key: &str,
list: Arc<LoroMovableList>,
) -> LoroResult<Arc<LoroMovableList>> {
let c = self
.inner
.get_or_create_container(key, list.as_ref().clone().inner)?;
Ok(Arc::new(LoroMovableList { inner: c }))
}
pub fn get_or_create_counter_container(
&self,
key: &str,
counter: Arc<LoroCounter>,
) -> LoroResult<Arc<LoroCounter>> {
let c = self
.inner
.get_or_create_container(key, counter.as_ref().clone().inner)?;
Ok(Arc::new(LoroCounter { inner: c }))
}
#[inline]
pub fn insert_list_container(
&self,
key: &str,
child: Arc<LoroList>,
) -> LoroResult<Arc<LoroList>> {
let c = self
.inner
.insert_container(key, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroList { inner: c }))
}
#[inline]
pub fn insert_map_container(&self, key: &str, child: Arc<LoroMap>) -> LoroResult<Arc<LoroMap>> {
let c = self
.inner
.insert_container(key, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroMap { inner: c }))
}
#[inline]
pub fn insert_text_container(
&self,
key: &str,
child: Arc<LoroText>,
) -> LoroResult<Arc<LoroText>> {
let c = self
.inner
.insert_container(key, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroText { inner: c }))
}
#[inline]
pub fn insert_tree_container(
&self,
key: &str,
child: Arc<LoroTree>,
) -> LoroResult<Arc<LoroTree>> {
let c = self
.inner
.insert_container(key, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroTree { inner: c }))
}
#[inline]
pub fn insert_movable_list_container(
&self,
key: &str,
child: Arc<LoroMovableList>,
) -> LoroResult<Arc<LoroMovableList>> {
let c = self
.inner
.insert_container(key, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroMovableList { inner: c }))
}
#[inline]
pub fn insert_counter_container(
&self,
key: &str,
child: Arc<LoroCounter>,
) -> LoroResult<Arc<LoroCounter>> {
let c = self
.inner
.insert_container(key, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroCounter { inner: c }))
}
pub fn get_value(&self) -> LoroValue {
self.inner.get_value().into()
}
pub fn get_deep_value(&self) -> LoroValue {
self.inner.get_deep_value().into()
}
pub fn is_deleted(&self) -> bool {
self.inner.is_deleted()
}
pub fn get_last_editor(&self, key: &str) -> Option<PeerID> {
self.inner.get_last_editor(key)
}
pub fn clear(&self) -> LoroResult<()> {
self.inner.clear()
}
pub fn keys(&self) -> Vec<String> {
self.inner.keys().map(|k| k.to_string()).collect()
}
pub fn values(&self) -> Vec<Arc<dyn ValueOrContainer>> {
self.inner
.values()
.map(|v| Arc::new(v) as Arc<dyn ValueOrContainer>)
.collect()
}
pub fn doc(&self) -> Option<Arc<LoroDoc>> {
self.inner.doc().map(|x| Arc::new(LoroDoc { doc: x }))
}
pub fn subscribe(&self, subscriber: Arc<dyn Subscriber>) -> Option<Arc<Subscription>> {
self.inner
.subscribe(Arc::new(move |e| {
subscriber.on_diff(DiffEvent::from(e));
}))
.map(|x| Arc::new(x.into()))
}
}
impl Default for LoroMap {
fn default() -> Self {
Self::new()
}
}