use std::collections::HashMap;
use crate::commands::buffer::Buffer;
use crate::commands::ParticleType;
use crate::errors::Result;
use crate::operations::cdt_context::CdtContext;
use crate::Value;
#[doc(hidden)]
pub enum CdtArgument<'a> {
Byte(u8),
Int(i64),
Bool(bool),
Value(&'a Value),
List(&'a [Value]),
Map(&'a HashMap<Value, Value>),
}
pub type OperationEncoder =
Box<dyn Fn(&mut Option<&mut Buffer>, &CdtOperation, &[CdtContext]) -> Result<usize>>;
#[doc(hidden)]
pub struct CdtOperation<'a> {
pub op: u8,
pub encoder: OperationEncoder,
pub args: Vec<CdtArgument<'a>>,
}
impl<'a> CdtOperation<'a> {
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)
}
}