use async_trait::async_trait;
use ecat_errors::Error;
#[async_trait]
pub trait WideColumnClient: Send + Sync {
async fn put(
&self,
table: &str,
row: &str,
cells: &std::collections::BTreeMap<String, serde_json::Value>,
) -> Result<(), Error>;
async fn get(
&self,
table: &str,
row: &str,
) -> Result<Option<std::collections::BTreeMap<String, serde_json::Value>>, Error>;
async fn scan(
&self,
table: &str,
prefix: &str,
limit: usize,
) -> Result<
Vec<(
String,
std::collections::BTreeMap<String, serde_json::Value>,
)>,
Error,
>;
async fn delete(&self, table: &str, row: &str) -> Result<(), Error>;
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::BTreeMap;
struct Noop;
#[async_trait]
impl WideColumnClient for Noop {
async fn put(
&self,
_table: &str,
_row: &str,
_cells: &BTreeMap<String, serde_json::Value>,
) -> Result<(), Error> {
Ok(())
}
async fn get(
&self,
_table: &str,
_row: &str,
) -> Result<Option<BTreeMap<String, serde_json::Value>>, Error> {
Ok(None)
}
async fn scan(
&self,
_table: &str,
_prefix: &str,
_limit: usize,
) -> Result<Vec<(String, BTreeMap<String, serde_json::Value>)>, Error> {
Ok(Vec::new())
}
async fn delete(&self, _table: &str, _row: &str) -> Result<(), Error> {
Ok(())
}
}
#[tokio::test]
async fn trait_is_object_safe() {
let client: Box<dyn WideColumnClient> = Box::new(Noop);
let mut cells = BTreeMap::new();
cells.insert("cf:a".to_string(), serde_json::json!(1));
client.put("t", "r", &cells).await.unwrap();
assert!(client.get("t", "r").await.unwrap().is_none());
assert!(client.scan("t", "", 10).await.unwrap().is_empty());
client.delete("t", "r").await.unwrap();
}
}