use std::collections::{BTreeMap, HashMap};
use std::fmt;
use std::sync::Arc;
use crate::commands::buffer::Buffer;
use crate::commands::ParticleType;
pub use crate::operations::cdt_context::CdtContext;
use crate::Result;
use crate::Value;
#[derive(Debug, Clone)]
pub enum CdtArgument {
Byte(u8),
Int(i64),
Bool(bool),
Value(Value),
List(Vec<Value>),
Map(HashMap<Value, Value>),
OrderedMap(BTreeMap<Value, Value>),
}
pub type OperationEncoder = Arc<
dyn Fn(&mut Option<&mut Buffer>, &CdtOperation, &[CdtContext]) -> Result<usize>
+ Send
+ Sync
+ 'static,
>;
#[derive(Clone)]
pub struct CdtOperation {
pub op: u8,
pub encoder: OperationEncoder,
pub args: Vec<CdtArgument>,
}
impl CdtOperation {
pub const fn particle_type(&self) -> ParticleType {
ParticleType::BLOB
}
pub fn estimate_size(&self, ctx: &[CdtContext]) -> Result<usize> {
let size: usize = (self.encoder)(&mut None, self, ctx)?;
Ok(size)
}
pub fn write_to(&self, buffer: &mut Buffer, ctx: &[CdtContext]) -> Result<usize> {
let size: usize = (self.encoder)(&mut Some(buffer), self, ctx)?;
Ok(size)
}
}
impl fmt::Debug for CdtOperation {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::result::Result<(), fmt::Error> {
#[derive(Debug)]
#[allow(unused)]
struct CdtOperation<'a> {
pub op: &'a u8,
pub args: &'a Vec<CdtArgument>,
}
let Self {
op,
encoder: _,
args,
} = self;
fmt::Debug::fmt(&CdtOperation { op, args }, f)
}
}