use bytes::Bytes;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Version {
#[default]
Resp2,
Resp3,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Value {
SimpleString(Bytes),
SimpleError(Bytes),
Integer(i64),
BulkString(Bytes),
Array(Vec<Value>),
Null,
Boolean(bool),
Double(f64),
BigNumber(Bytes),
BulkError(Bytes),
VerbatimString { encoding: [u8; 3], data: Bytes },
Map(Vec<(Value, Value)>),
Attribute { attrs: Vec<(Value, Value)>, value: Box<Value> },
Set(Vec<Value>),
Push(Vec<Value>),
}
impl Value {
pub fn is_error(&self) -> bool {
matches!(self, Self::SimpleError(_) | Self::BulkError(_))
}
pub fn is_null(&self) -> bool {
matches!(self, Self::Null)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_error_covers_all_variants() {
assert!(Value::SimpleError(Bytes::from("ERR msg")).is_error());
assert!(Value::BulkError(Bytes::from("SYNTAX detail")).is_error());
assert!(!Value::SimpleString(Bytes::from("OK")).is_error());
assert!(!Value::Integer(0).is_error());
assert!(!Value::Null.is_error());
assert!(!Value::Boolean(false).is_error());
}
#[test]
fn is_null_only_for_null_variant() {
assert!(Value::Null.is_null());
assert!(!Value::Integer(0).is_null());
assert!(!Value::SimpleString(Bytes::from("")).is_null());
assert!(!Value::Boolean(false).is_null());
assert!(!Value::BulkString(Bytes::new()).is_null());
}
}