use crate::cesr::cigar::Cigar;
use crate::cesr::dater::Dater;
use crate::cesr::diger::Diger;
use crate::cesr::indexing::siger::Siger;
use crate::cesr::number::Number;
use crate::cesr::prefixer::Prefixer;
use crate::cesr::saider::Saider;
use crate::cesr::seqner::Seqner;
use crate::cesr::verfer::Verfer;
use crate::cesr::{BaseMatter, Parsable};
use crate::keri::db::dbing::LMDBer;
use crate::keri::db::subing::cesr::CesrSuberBase;
use crate::keri::db::subing::{Suber, SuberError};
use crate::Matter;
use std::sync::Arc;
pub struct CatCesrSuberBase<'db, M: Matter> {
pub base: CesrSuberBase<'db, M>,
pub formats: Vec<String>,
}
impl<'db, M: Matter + Parsable> CatCesrSuberBase<'db, M> {
pub fn new(
db: Arc<&'db LMDBer>,
subkey: &str,
formats: Vec<String>,
sep: Option<u8>,
verify: bool,
) -> Result<Self, SuberError> {
let base = CesrSuberBase::new(db, subkey, sep, verify)?;
Ok(Self { base, formats })
}
pub fn ser(&self, val: &[&dyn Matter]) -> Result<Vec<u8>, SuberError> {
match self.formats.as_slice() {
[a] if a == "siger" => {
if val.len() != 1 {
return Err(SuberError::ValueConversionError(
"Expected 1 value for siger format".to_string(),
));
}
let siger = match val[0].as_any().downcast_ref::<Siger>() {
Some(s) => s,
None => {
return Err(SuberError::ValueConversionError(
"Value must be a Siger".to_string(),
))
}
};
self.ser_from_siger(siger)
}
[a, b] if a == "seqner" && b == "saider" => {
if val.len() != 2 {
return Err(SuberError::ValueConversionError(
"Expected 2 values for seqner saider format".to_string(),
));
}
self.ser_from_seqner_saider(val[0], val[1])
}
[a, b] if a == "verfer" && b == "cigar" => {
if val.len() != 2 {
return Err(SuberError::ValueConversionError(
"Expected 2 values for verfer cigar format".to_string(),
));
}
self.ser_from_verfer_cigar(val[0], val[1])
}
[a, b] if a == "number" && b == "saider" => {
if val.len() != 2 {
return Err(SuberError::ValueConversionError(
"Expected 2 values for number saider format".to_string(),
));
}
self.ser_from_number_saider(val[0], val[1])
}
[a, b] if a == "prefixer" && b == "seqner" => {
if val.len() != 2 {
return Err(SuberError::ValueConversionError(
"Expected 2 values for prefixer seqner format".to_string(),
));
}
self.ser_from_prefixer_seqner(val[0], val[1])
}
[a, b] if a == "seqner" && b == "diger" => {
if val.len() != 2 {
return Err(SuberError::ValueConversionError(
"Expected 2 values for seqner diger format".to_string(),
));
}
self.ser_from_seqner_diger(val[0], val[1])
}
[a, b, c] if a == "dater" && b == "seqner" && c == "diger" => {
if val.len() != 3 {
return Err(SuberError::ValueConversionError(
"Expected 3 values for dater, seqner, diger format".to_string(),
));
}
self.ser_from_dater_seqner_diger(val[0], val[1], val[2])
}
[a, b, c] if a == "prefixer" && b == "seqner" && c == "saider" => {
if val.len() != 3 {
return Err(SuberError::ValueConversionError(
"Expected 3 values for prefixer, seqner, diger format".to_string(),
));
}
self.ser_from_prefixer_seqner_saider(val[0], val[1], val[2])
}
_ => {
Ok(val[0].qb64b())
}
}
}
pub fn des(&self, val: &[u8]) -> Result<Vec<Box<dyn Matter>>, SuberError> {
match self.formats.as_slice() {
[a] if a == "siger" => self.des_to_siger(val),
[a, b] if a == "seqner" && b == "saider" => self.des_to_seqner_saider(val),
[a, b] if a == "seqner" && b == "diger" => self.des_to_seqner_diger(val),
[a, b] if a == "verfer" && b == "cigar" => self.des_to_verfer_cigar(val),
[a, b] if a == "number" && b == "saider" => self.des_to_number_saider(val),
[a, b] if a == "prefixer" && b == "seqner" => self.des_to_prefixer_seqner(val),
[a, b, c] if a == "dater" && b == "seqner" && c == "diger" => {
self.des_to_dater_seqner_diger(val)
}
[a, b, c] if a == "prefixer" && b == "seqner" && c == "saider" => {
self.des_to_prefixer_seqner_saider(val)
}
_ => {
let matter = BaseMatter::from_qb64b(&mut val.to_vec(), None)
.map_err(|e| SuberError::MatterError(e))?;
let boxed: Box<dyn Matter> = Box::new(matter);
Ok(vec![boxed])
}
}
}
pub fn ser_from_siger(&self, siger: &Siger) -> Result<Vec<u8>, SuberError> {
Ok(siger.qb64b())
}
pub fn des_to_siger(&self, val: &[u8]) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let siger = Siger::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Siger: {}", e))
})?;
let result: Vec<Box<dyn Matter>> = vec![Box::new(siger)];
Ok(result)
}
pub fn ser_from_seqner_saider(
&self,
seqner: &dyn Matter,
saider: &dyn Matter,
) -> Result<Vec<u8>, SuberError> {
let mut result = Vec::new();
result.extend_from_slice(&seqner.qb64b());
result.extend_from_slice(&saider.qb64b());
Ok(result)
}
pub fn des_to_seqner_saider(&self, val: &[u8]) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let seqner = Seqner::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Seqner: {}", e))
})?;
let saider = Saider::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Saider: {}", e))
})?;
let result: Vec<Box<dyn Matter>> = vec![Box::new(seqner), Box::new(saider)];
Ok(result)
}
pub fn ser_from_verfer_cigar(
&self,
verfer: &dyn Matter,
cigar: &dyn Matter,
) -> Result<Vec<u8>, SuberError> {
let mut result = Vec::new();
result.extend_from_slice(&verfer.qb64b());
result.extend_from_slice(&cigar.qb64b());
Ok(result)
}
pub fn des_to_verfer_cigar(&self, val: &[u8]) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let verfer = Verfer::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Verfer: {}", e))
})?;
let cigar = Cigar::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Cigar: {}", e))
})?;
let result: Vec<Box<dyn Matter>> = vec![Box::new(verfer), Box::new(cigar)];
Ok(result)
}
pub fn ser_from_number_saider(
&self,
number: &dyn Matter,
saider: &dyn Matter,
) -> Result<Vec<u8>, SuberError> {
let mut result = Vec::new();
result.extend_from_slice(&number.qb64b());
result.extend_from_slice(&saider.qb64b());
Ok(result)
}
pub fn des_to_number_saider(&self, val: &[u8]) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let number = Number::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Number: {}", e))
})?;
let saider = Saider::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Saider: {}", e))
})?;
let result: Vec<Box<dyn Matter>> = vec![Box::new(number), Box::new(saider)];
Ok(result)
}
pub fn ser_from_prefixer_seqner(
&self,
prefixer: &dyn Matter,
seqner: &dyn Matter,
) -> Result<Vec<u8>, SuberError> {
let mut result = Vec::new();
result.extend_from_slice(&prefixer.qb64b());
result.extend_from_slice(&seqner.qb64b());
Ok(result)
}
pub fn des_to_prefixer_seqner(&self, val: &[u8]) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let prefixer = Prefixer::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Prefixer: {}", e))
})?;
let seqner = Seqner::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Seqner: {}", e))
})?;
let result: Vec<Box<dyn Matter>> = vec![Box::new(prefixer), Box::new(seqner)];
Ok(result)
}
pub fn ser_from_seqner_diger(
&self,
seqner: &dyn Matter,
diger: &dyn Matter,
) -> Result<Vec<u8>, SuberError> {
let mut result = Vec::new();
result.extend_from_slice(&seqner.qb64b());
result.extend_from_slice(&diger.qb64b());
Ok(result)
}
pub fn des_to_seqner_diger(&self, val: &[u8]) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let seqner = Seqner::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Seqner: {}", e))
})?;
let diger = Diger::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Diger: {}", e))
})?;
let result: Vec<Box<dyn Matter>> = vec![Box::new(seqner), Box::new(diger)];
Ok(result)
}
pub fn ser_from_dater_seqner_diger(
&self,
dater: &dyn Matter,
seqner: &dyn Matter,
diger: &dyn Matter,
) -> Result<Vec<u8>, SuberError> {
let mut result = Vec::new();
result.extend_from_slice(&dater.qb64b());
result.extend_from_slice(&seqner.qb64b());
result.extend_from_slice(&diger.qb64b());
Ok(result)
}
pub fn des_to_dater_seqner_diger(
&self,
val: &[u8],
) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let dater = Dater::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Dater: {}", e))
})?;
let seqner = Seqner::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Seqner: {}", e))
})?;
let diger = Diger::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Diger: {}", e))
})?;
let result: Vec<Box<dyn Matter>> = vec![Box::new(dater), Box::new(seqner), Box::new(diger)];
Ok(result)
}
pub fn ser_from_prefixer_seqner_saider(
&self,
prefixer: &dyn Matter,
seqner: &dyn Matter,
saider: &dyn Matter,
) -> Result<Vec<u8>, SuberError> {
let mut result = Vec::new();
result.extend_from_slice(&prefixer.qb64b());
result.extend_from_slice(&seqner.qb64b());
result.extend_from_slice(&saider.qb64b());
Ok(result)
}
pub fn des_to_prefixer_seqner_saider(
&self,
val: &[u8],
) -> Result<Vec<Box<dyn Matter>>, SuberError> {
let mut data = val.to_vec();
let prefixer = Prefixer::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse prefixer: {}", e))
})?;
let seqner = Seqner::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse Seqner: {}", e))
})?;
let saider = Saider::from_qb64b(&mut data, Some(true)).map_err(|e| {
SuberError::DeserializationError(format!("Failed to parse saider: {}", e))
})?;
let result: Vec<Box<dyn Matter>> =
vec![Box::new(prefixer), Box::new(seqner), Box::new(saider)];
Ok(result)
}
}
pub struct CatCesrSuber<'db, M: Matter> {
pub base: CatCesrSuberBase<'db, M>,
pub suber: Suber<'db>,
}
impl<'db, M: Matter + Parsable> CatCesrSuber<'db, M> {
pub fn new(
db: Arc<&'db LMDBer>,
subkey: &str,
formats: Vec<String>,
sep: Option<u8>,
verify: bool,
) -> Result<Self, SuberError> {
let base = CatCesrSuberBase::new(db.clone(), subkey, formats, sep, verify)?;
let suber = Suber::new(db, subkey, sep, verify)?;
Ok(Self { base, suber })
}
pub fn put<K: AsRef<[u8]>>(
&self,
keys: &[K],
vals: &[&dyn Matter],
) -> Result<bool, SuberError> {
let val_bytes = self.base.ser(vals)?;
self.suber.put(keys, &val_bytes)
}
pub fn pin<K: AsRef<[u8]>>(
&self,
keys: &[K],
vals: &[&dyn Matter],
) -> Result<bool, SuberError> {
let val_bytes = self.base.ser(vals)?;
self.suber.pin(keys, &val_bytes)
}
pub fn get<K: AsRef<[u8]>>(
&self,
keys: &[K],
) -> Result<Option<Vec<Box<dyn Matter>>>, SuberError> {
let val_opt = self.suber.get::<K, Vec<u8>>(keys)?;
match val_opt {
Some(val_bytes) => {
let deserialized = self.base.des(&val_bytes)?;
Ok(Some(deserialized))
}
None => Ok(None),
}
}
pub fn rem<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<bool, SuberError> {
self.suber.rem(keys)
}
pub fn trim<K: AsRef<[u8]>>(&self, keys: &[K], topive: bool) -> Result<bool, SuberError> {
self.suber.trim(keys, topive)
}
pub fn get_full_item_iter<K: AsRef<[u8]>>(
&self,
keys: &[K],
topive: bool,
) -> Result<Vec<(Vec<Vec<u8>>, Vec<u8>)>, SuberError> {
self.suber.base.get_full_item_iter(keys, topive)
}
pub fn get_item_iter<K: AsRef<[u8]>>(
&self,
keys: &[K],
topive: bool,
) -> Result<Vec<(Vec<Vec<u8>>, Vec<u8>)>, SuberError> {
self.suber.base.get_item_iter(keys, topive)
}
pub fn process_items(
&self,
items: Vec<(Vec<Vec<u8>>, Vec<u8>)>,
) -> Result<Vec<(Vec<Vec<u8>>, Vec<Box<dyn Matter>>)>, SuberError> {
let mut result = Vec::new();
for (keys, val) in items {
let deserialized = self.base.des(&val)?;
result.push((keys, deserialized));
}
Ok(result)
}
pub fn to_key<K: AsRef<[u8]>>(&self, keys: &[K], topive: bool) -> Vec<u8> {
self.suber.base.to_key(keys, topive)
}
pub fn to_keys(&self, key: &[u8]) -> Vec<Vec<u8>> {
self.suber.base.to_keys(key)
}
pub fn cnt_all(&self) -> Result<usize, SuberError> {
self.suber.cnt_all()
}
}
#[cfg(test)]
mod tests {
use crate::cesr::dater::Dater;
use crate::cesr::diger::Diger;
use crate::cesr::indexing::siger::Siger;
use crate::cesr::prefixer::Prefixer;
use crate::cesr::saider::Saider;
use crate::cesr::seqner::Seqner;
use crate::cesr::{BaseMatter, Matter, Parsable};
use crate::keri::db::dbing::LMDBerBuilder;
use crate::keri::db::subing::catcesr::CatCesrSuber;
use crate::keri::db::subing::SuberError;
use std::sync::Arc;
#[test]
fn test_cat_cesr_suber() -> Result<(), SuberError> {
let db = LMDBerBuilder::default()
.name("test")
.temp(true)
.build()
.unwrap();
assert_eq!(db.name(), "test");
assert!(db.opened());
{
let db_ref = Arc::new(&db);
let sdb = CatCesrSuber::<BaseMatter>::new(
db_ref.clone(),
"ssdb.",
vec!["seqner".to_string(), "saider".to_string()],
None,
false,
)?;
let seqner = Seqner::from_sn(42);
let seqb = seqner.qb64b();
assert_eq!(seqb, b"0AAAAAAAAAAAAAAAAAAAAAAq");
let saider = Saider::from_qb64("EAWY-bDoF3C0LXQBcMNKNnZJNyjRFwzPF6QUQPfBRT7x").unwrap();
let saidb = saider.qb64b();
let vals: Vec<&dyn Matter> = vec![&seqner, &saider];
let valb = sdb.base.ser(&vals)?;
assert_eq!(valb, [&seqb[..], &saidb[..]].concat());
let des_result = sdb.base.des(&valb)?;
let des_values = des_result;
assert_eq!(des_values.len(), 2);
let des_seqner = des_values[0].as_any().downcast_ref::<Seqner>().unwrap();
let des_saider = des_values[1].as_any().downcast_ref::<Saider>().unwrap();
assert_eq!(des_seqner.qb64b(), seqner.qb64b());
assert_eq!(des_saider.qb64b(), saider.qb64b());
let combined = [&des_seqner.qb64b()[..], &des_saider.qb64b()[..]].concat();
assert_eq!(combined, valb);
let keys = ["witness", "receipt"];
assert!(sdb.put(&keys, &vals)?);
let actuals = sdb.get(&keys)?;
assert!(actuals.is_some());
let actuals = actuals.unwrap();
assert_eq!(actuals.len(), 2);
let retrieved_seqner = actuals[0].as_any().downcast_ref::<Seqner>().unwrap();
let retrieved_saider = actuals[1].as_any().downcast_ref::<Saider>().unwrap();
assert_eq!(retrieved_seqner.qb64b(), seqner.qb64b());
assert_eq!(retrieved_saider.qb64b(), saider.qb64b());
assert!(sdb.rem(&keys)?);
let actuals = sdb.get(&keys)?;
assert!(actuals.is_none());
}
{
let db_ref = Arc::new(&db);
let sdb = CatCesrSuber::<BaseMatter>::new(
db_ref.clone(),
"pssdb.",
vec![
"prefixer".to_string(),
"seqner".to_string(),
"saider".to_string(),
],
None,
false,
)?;
let prefixer =
Prefixer::from_qb64("BDzwEHHzq7K0gzQPYGGwTmuupUhPx5_yZ-Wk1x4ejhcc").unwrap();
let preb = prefixer.qb64b();
let seqner = Seqner::from_sn(99);
let seqb = seqner.qb64b();
assert_eq!(seqb, b"0AAAAAAAAAAAAAAAAAAAAABj");
let saider = Saider::from_qb64("EAWY-bDoF3C0LXQBcMNKNnZJNyjRFwzPF6QUQPfBRT7x").unwrap();
let saidb = saider.qb64b();
let vals: Vec<&dyn Matter> = vec![&prefixer, &seqner, &saider];
let valb = sdb.base.ser(&vals)?;
assert_eq!(valb, [&preb[..], &seqb[..], &saidb[..]].concat());
let des_result = sdb.base.des(&valb)?;
let des_values = des_result;
assert_eq!(des_values.len(), 3);
let des_prefixer = des_values[0].as_any().downcast_ref::<Prefixer>().unwrap();
let des_seqner = des_values[1].as_any().downcast_ref::<Seqner>().unwrap();
let des_saider = des_values[2].as_any().downcast_ref::<Saider>().unwrap();
assert_eq!(des_prefixer.qb64b(), prefixer.qb64b());
assert_eq!(des_seqner.qb64b(), seqner.qb64b());
assert_eq!(des_saider.qb64b(), saider.qb64b());
let combined = [
&des_prefixer.qb64b()[..],
&des_seqner.qb64b()[..],
&des_saider.qb64b()[..],
]
.concat();
assert_eq!(combined, valb);
let keys = ["delegate", "anchor"];
assert!(sdb.put(&keys, &vals)?);
let actuals = sdb.get(&keys)?;
assert!(actuals.is_some());
let actuals = actuals.unwrap();
assert_eq!(actuals.len(), 3);
let retrieved_prefixer = actuals[0].as_any().downcast_ref::<Prefixer>().unwrap();
let retrieved_seqner = actuals[1].as_any().downcast_ref::<Seqner>().unwrap();
let retrieved_saider = actuals[2].as_any().downcast_ref::<Saider>().unwrap();
assert_eq!(retrieved_prefixer.qb64b(), prefixer.qb64b());
assert_eq!(retrieved_seqner.qb64b(), seqner.qb64b());
assert_eq!(retrieved_saider.qb64b(), saider.qb64b());
let new_prefixer =
Prefixer::from_qb64("BHHzqZWzwE-Wk7K0gzQPYGGwTmuupUhPx5_y1x4ejhcc").unwrap();
let new_seqner = Seqner::from_sn(100);
let new_saider =
Saider::from_qb64("EBJPik4FxfCl-FFsSyGhHpO1VdRQTqIFr11JrYJBSBVk").unwrap();
let new_vals: Vec<&dyn Matter> = vec![&new_prefixer, &new_seqner, &new_saider];
assert!(sdb.pin(&keys, &new_vals)?);
let actuals = sdb.get(&keys)?.unwrap();
assert_eq!(actuals.len(), 3);
let retrieved_prefixer = actuals[0].as_any().downcast_ref::<Prefixer>().unwrap();
let retrieved_seqner = actuals[1].as_any().downcast_ref::<Seqner>().unwrap();
let retrieved_saider = actuals[2].as_any().downcast_ref::<Saider>().unwrap();
assert_eq!(retrieved_prefixer.qb64b(), new_prefixer.qb64b());
assert_eq!(retrieved_seqner.qb64b(), new_seqner.qb64b());
assert_eq!(retrieved_saider.qb64b(), new_saider.qb64b());
assert!(sdb.rem(&keys)?);
let actuals = sdb.get(&keys)?;
assert!(actuals.is_none());
}
{
let db_ref = Arc::new(&db);
let sdb = CatCesrSuber::<BaseMatter>::new(
db_ref.clone(),
"bags.",
vec![], Some(b'.'),
false,
)?;
let matb0 = "BDzwEHHzq7K0gzQPYGGwTmuupUhPx5_yZ-Wk1x4ejhcc";
let matter0 = BaseMatter::from_qb64(matb0).unwrap();
let vals0: Vec<&dyn Matter> = vec![&matter0];
let matb1 = "BHHzqZWzwE-Wk7K0gzQPYGGwTmuupUhPx5_y1x4ejhcc";
let matter1 = BaseMatter::from_qb64(matb1).unwrap();
let vals1: Vec<&dyn Matter> = vec![&matter1];
let keys0 = ["alpha", "dog"];
assert!(sdb.put(&keys0, &vals0)?);
let actuals = sdb.get(&keys0)?;
assert!(actuals.is_some());
let actuals = actuals.unwrap();
assert_eq!(actuals.len(), 1);
let retrieved = actuals[0].as_any().downcast_ref::<BaseMatter>().unwrap();
assert_eq!(retrieved.qb64(), matter0.qb64());
assert!(sdb.rem(&keys0)?);
let actuals = sdb.get(&keys0)?;
assert!(actuals.is_none());
assert!(sdb.put(&keys0, &vals0)?);
let actuals = sdb.get(&keys0)?.unwrap();
assert_eq!(actuals.len(), 1);
let retrieved = actuals[0].as_any().downcast_ref::<BaseMatter>().unwrap();
assert_eq!(retrieved.qb64(), matter0.qb64());
let result = sdb.put(&keys0, &vals1)?;
assert!(!result);
assert!(sdb.pin(&keys0, &vals1)?);
let actuals = sdb.get(&keys0)?.unwrap();
assert_eq!(actuals.len(), 1);
let retrieved = actuals[0].as_any().downcast_ref::<BaseMatter>().unwrap();
assert_eq!(retrieved.qb64(), matter1.qb64());
assert!(sdb.rem(&keys0)?);
let actuals = sdb.get(&keys0)?;
assert!(actuals.is_none());
let keys1 = ["beta.fish"];
assert!(sdb.put(&keys1, &vals1)?);
let actuals = sdb.get(&keys1)?.unwrap();
assert_eq!(actuals.len(), 1);
let retrieved = actuals[0].as_any().downcast_ref::<BaseMatter>().unwrap();
assert_eq!(retrieved.qb64(), matter1.qb64());
assert!(sdb.rem(&keys1)?);
let actuals = sdb.get(&keys1)?;
assert!(actuals.is_none());
let badkey = ["badkey"];
let actuals = sdb.get(&badkey)?;
assert!(actuals.is_none());
assert!(sdb.put(&keys0, &vals0)?);
assert!(sdb.put(&keys1, &vals1)?);
let prefix_key: [&str; 0] = [];
let raw_items = sdb.get_item_iter(&prefix_key, true)?;
let items: Vec<(Vec<String>, String)> = raw_items
.iter()
.map(|(keys, vals)| {
let key_strs = keys
.iter()
.map(|k| String::from_utf8(k.clone()).unwrap())
.collect();
let matter = BaseMatter::from_qb64b(&mut vals.clone(), None).unwrap();
let qb64 = matter.qb64();
(key_strs, qb64)
})
.collect();
let mut found_item1 = false;
let mut found_item2 = false;
for (key_parts, val) in items {
if (key_parts[0] == "alpha" && key_parts[1] == "dog" && val == matter0.qb64())
|| (key_parts.len() == 1
&& key_parts[0] == "alpha.dog"
&& val == matter0.qb64())
{
found_item1 = true;
}
if (key_parts[0] == "beta" && key_parts[1] == "fish" && val == matter1.qb64())
|| (key_parts.len() == 1
&& key_parts[0] == "beta.fish"
&& val == matter1.qb64())
{
found_item2 = true;
}
}
assert!(found_item1);
assert!(found_item2);
assert!(sdb.put(&["b", "1"], &vals0)?);
assert!(sdb.put(&["b", "2"], &vals1)?);
assert!(sdb.put(&["c", "1"], &vals0)?);
assert!(sdb.put(&["c", "2"], &vals1)?);
let topkeys = ["b", ""];
let raw_items = sdb.get_item_iter(&topkeys, true)?;
let items: Vec<(Vec<String>, String)> = raw_items
.iter()
.map(|(keys, vals)| {
let key_strs = keys
.iter()
.map(|k| String::from_utf8(k.clone()).unwrap())
.collect();
let matter = BaseMatter::from_qb64b(&mut vals.clone(), None).unwrap();
let qb64 = matter.qb64();
(key_strs, qb64)
})
.collect();
assert_eq!(items.len(), 2);
let mut found_b1 = false;
let mut found_b2 = false;
for (key_parts, val) in items {
if (key_parts[0] == "b" && key_parts[1] == "1" && val == matter0.qb64()) {
found_b1 = true;
}
if (key_parts[0] == "b" && key_parts[1] == "2" && val == matter1.qb64()) {
found_b2 = true;
}
}
assert!(found_b1);
assert!(found_b2);
}
{
let db_ref = Arc::new(&db);
let sdb = CatCesrSuber::<BaseMatter>::new(
db_ref.clone(),
"bags.",
vec![
"dater".to_string(),
"seqner".to_string(),
"diger".to_string(),
],
None,
false,
)?;
let dater = Dater::from_dt(chrono::Utc::now());
let datb = dater.qb64b();
let seqner = Seqner::from_sn(20);
let seqb = seqner.qb64b();
assert_eq!(seqb, b"0AAAAAAAAAAAAAAAAAAAAAAU");
let diger = Diger::from_ser("Hello Me Maties.".as_bytes(), None)?;
let digb = diger.qb64b();
let vals: Vec<&dyn Matter> = vec![&dater, &seqner, &diger];
let valb = sdb.base.ser(&vals)?;
assert_eq!(valb, [&datb[..], &seqb[..], &digb[..]].concat());
let des_result = sdb.base.des(&valb)?;
let des_values = des_result;
assert_eq!(des_values.len(), 3);
let des_dater = des_values[0].as_any().downcast_ref::<Dater>().unwrap();
let des_seqner = des_values[1].as_any().downcast_ref::<Seqner>().unwrap();
let des_diger = des_values[2].as_any().downcast_ref::<Diger>().unwrap();
assert_eq!(des_dater.qb64b(), dater.qb64b());
assert_eq!(des_seqner.qb64b(), seqner.qb64b());
assert_eq!(des_diger.qb64b(), diger.qb64b());
let combined = [
&des_dater.qb64b()[..],
&des_seqner.qb64b()[..],
&des_diger.qb64b()[..],
]
.concat();
assert_eq!(combined, valb);
}
{
let db_ref = Arc::new(&db);
let sdb = CatCesrSuber::<BaseMatter>::new(
db_ref.clone(),
"pigs.",
vec!["siger".to_string()],
None,
false,
)?;
let sig0 = "AACdI8OSQkMJ9r-xigjEByEjIua7LHH3AOJ22PQKqljMhuhcgh9nGRcKnsz5KvKd7K_H9-1298F4Id1DxvIoEmCQ";
let val0 = Siger::from_qb64(sig0, None).unwrap();
let keys = ["zeta", "cat"];
assert!(sdb.put(&keys, &[&val0])?);
let actuals = sdb.get(&keys)?.unwrap();
assert_eq!(actuals.len(), 1);
let actual_siger = actuals[0].as_any().downcast_ref::<Siger>().unwrap();
assert_eq!(actual_siger.qb64(), val0.qb64());
}
Ok(())
}
}