use bitflags::bitflags;
use wresp::RespWriter;
use zmij::Buffer;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct ObjectOutputFlags: u8 {
const NONE = 0;
const REMOVE_KEY = 1;
const WRONG_TYPE = 1 << 1;
}
}
#[derive(Debug, Clone, Default)]
pub struct ObjectOutput {
pub payload: Vec<u8>,
pub result1: i64,
pub result2: i64,
pub output_flags: ObjectOutputFlags,
}
impl ObjectOutput {
#[inline]
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn from_pinned_pointer(payload: Vec<u8>) -> Self {
Self {
payload,
..Self::default()
}
}
#[inline]
pub fn has_wrong_type(&self) -> bool {
self.output_flags.contains(ObjectOutputFlags::WRONG_TYPE)
}
#[inline(always)]
pub fn writer2(&mut self) -> wresp::RespWriter<&mut Vec<u8>, wresp::Resp2> {
RespWriter::new_ref(&mut self.payload)
}
#[inline(always)]
pub fn writer3(&mut self) -> wresp::RespWriter<&mut Vec<u8>, wresp::Resp3> {
RespWriter::new_ref_p(&mut self.payload)
}
#[inline(always)]
pub fn writer<P: wresp::RespProtocol>(&mut self) -> wresp::RespWriter<&mut Vec<u8>, P> {
RespWriter::new_ref_p(&mut self.payload)
}
#[inline]
pub fn write_error(&mut self, msg: &[u8]) {
self.writer2().write_error_bytes(msg);
}
#[inline]
pub fn write_int64(&mut self, value: i64) {
self.writer2().write_int64(value);
}
#[inline]
pub fn write_int64_as_bulk_string(&mut self, value: i64) {
self.writer2().write_int64_as_bulk_string(value);
}
#[inline]
pub fn write_bulk_string(&mut self, item: &[u8]) {
self.writer2().write_bulk_string(item);
}
#[inline]
pub fn write_ascii_bulk_string(&mut self, chars: &[u8]) {
self.writer2().write_bulk_string(chars);
}
#[inline]
pub fn write_array_length(&mut self, len: usize) {
self.writer2().write_array_length(len);
}
#[inline]
pub fn write_empty_array(&mut self) {
self.writer2().write_empty_array();
}
#[inline(always)]
pub fn write_map_len<P: wresp::RespProtocol>(&mut self, len: usize) {
self.writer::<P>().write_map_len(len);
}
#[inline]
pub fn write_map_length(&mut self, len: usize, resp_protocol_version: u8) {
if resp_protocol_version >= 3 {
self.write_map_len::<wresp::Resp3>(len);
} else {
self.write_map_len::<wresp::Resp2>(len);
}
}
#[inline(always)]
pub fn write_set_len<P: wresp::RespProtocol>(&mut self, len: usize) {
self.writer::<P>().write_set_len(len);
}
#[inline]
pub fn write_set_length(&mut self, len: usize, resp_protocol_version: u8) {
if resp_protocol_version >= 3 {
self.write_set_len::<wresp::Resp3>(len);
} else {
self.write_set_len::<wresp::Resp2>(len);
}
}
#[inline(always)]
pub fn write_null_p<P: wresp::RespProtocol>(&mut self) {
self.writer::<P>().write_null();
}
#[inline]
pub fn write_null(&mut self, resp_protocol_version: u8) {
if resp_protocol_version >= 3 {
self.write_null_p::<wresp::Resp3>();
} else {
self.write_null_p::<wresp::Resp2>();
}
}
#[inline(always)]
pub fn write_null_array_p<P: wresp::RespProtocol>(&mut self) {
self.writer::<P>().write_null_array();
}
#[inline]
pub fn write_null_array(&mut self, resp_protocol_version: u8) {
if resp_protocol_version >= 3 {
self.write_null_array_p::<wresp::Resp3>();
} else {
self.write_null_array_p::<wresp::Resp2>();
}
}
#[inline]
pub fn write_array_item(&mut self, item: i64) {
self.writer2().write_array_item(item);
}
#[inline]
pub fn format_double_to(value: f64, buf: &mut zmij::Buffer) -> &str {
wresp::format_double(value, buf)
}
#[inline]
pub fn format_double(value: f64) -> String {
let mut buf = Buffer::new();
wresp::format_double(value, &mut buf).to_string()
}
#[inline]
pub fn write_double_bulk_string(&mut self, value: f64) {
self.writer2().write_double_bulk_string(value);
}
#[inline(always)]
pub fn write_double_numeric_p<P: wresp::RespProtocol>(&mut self, value: f64) {
self.writer::<P>().write_double_numeric(value);
}
#[inline]
pub fn write_double_numeric(&mut self, value: f64, resp_protocol_version: u8) {
if resp_protocol_version >= 3 {
self.write_double_numeric_p::<wresp::Resp3>(value);
} else {
self.write_double_numeric_p::<wresp::Resp2>(value);
}
}
#[inline]
pub fn write_simple_string(&mut self, msg: &str) {
self.writer2().write_simple_string(msg);
}
#[inline(always)]
pub fn write_bool_p<P: wresp::RespProtocol>(&mut self, value: bool) {
self.writer::<P>().write_bool(value);
}
#[inline]
pub fn write_bool(&mut self, value: bool, resp_protocol_version: u8) {
if resp_protocol_version >= 3 {
self.write_bool_p::<wresp::Resp3>(value);
} else {
self.write_bool_p::<wresp::Resp2>(value);
}
}
}