use crate::error::Result;
use crate::session::Session;
use crate::types::{MetaValue, Target, ValueType};
pub struct SessionTargetHandle<'a> {
session: &'a Session,
target: Target,
}
impl<'a> SessionTargetHandle<'a> {
pub(crate) fn new(session: &'a Session, target: Target) -> Self {
Self { session, target }
}
pub fn get_value(&self, key: &str) -> Result<Option<MetaValue>> {
self.session.store.get_value(&self.target, key)
}
pub fn set(&self, key: &str, value: impl Into<MetaValue>) -> Result<()> {
let meta_value = value.into();
self.session.store.set_value(
&self.target,
key,
&meta_value,
self.session.email(),
self.session.now(),
)
}
pub fn remove(&self, key: &str) -> Result<bool> {
self.session
.store
.remove(&self.target, key, self.session.email(), self.session.now())
}
pub fn list_push(&self, key: &str, value: &str) -> Result<()> {
self.session.store.list_push(
&self.target,
key,
value,
self.session.email(),
self.session.now(),
)
}
pub fn list_pop(&self, key: &str, value: &str) -> Result<()> {
self.session.store.list_pop(
&self.target,
key,
value,
self.session.email(),
self.session.now(),
)
}
pub fn list_remove(&self, key: &str, index: usize) -> Result<()> {
self.session.store.list_remove(
&self.target,
key,
index,
self.session.email(),
self.session.now(),
)
}
pub fn set_add(&self, key: &str, value: &str) -> Result<()> {
self.session.store.set_add(
&self.target,
key,
value,
self.session.email(),
self.session.now(),
)
}
pub fn set_remove(&self, key: &str, value: &str) -> Result<()> {
self.session.store.set_remove(
&self.target,
key,
value,
self.session.email(),
self.session.now(),
)
}
pub fn target(&self) -> &Target {
&self.target
}
pub fn get_all_values(&self, prefix: Option<&str>) -> Result<Vec<(String, MetaValue)>> {
let entries = self.session.store.get_all(&self.target, prefix)?;
let mut result = Vec::with_capacity(entries.len());
for entry in entries {
let meta_value = match entry.value_type {
ValueType::String => {
let s: String =
serde_json::from_str(&entry.value).unwrap_or_else(|_| entry.value.clone());
MetaValue::String(s)
}
ValueType::List => {
let entries = crate::list_value::parse_entries(&entry.value)?;
MetaValue::List(entries)
}
ValueType::Set => {
let members: Vec<String> = serde_json::from_str(&entry.value)?;
MetaValue::Set(members.into_iter().collect())
}
};
result.push((entry.key, meta_value));
}
Ok(result)
}
pub fn list_entries(&self, key: &str) -> Result<Vec<crate::list_value::ListEntry>> {
self.session.store.list_entries(&self.target, key)
}
pub fn get_authorship(&self, key: &str) -> Result<Option<crate::db::types::Authorship>> {
self.session.store.get_authorship(&self.target, key)
}
}