use std::fmt::Display;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ScalarType {
Boolean,
Integer,
Binary,
String,
}
impl Display for ScalarType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ScalarType::Boolean => write!(f, "BOOLEAN"),
ScalarType::Integer => write!(f, "INTEGER"),
ScalarType::String => write!(f, "STRING"),
ScalarType::Binary => write!(f, "BINARY"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum Scalar {
Boolean(bool),
Integer(i64),
Binary(Vec<u8>),
String(String),
}
impl Scalar {
#[must_use]
pub fn ty(&self) -> ScalarType {
match self {
Scalar::Boolean(_) => ScalarType::Boolean,
Scalar::Integer(_) => ScalarType::Integer,
Scalar::Binary(_) => ScalarType::Binary,
Scalar::String(_) => ScalarType::String,
}
}
}
impl From<bool> for Scalar {
fn from(value: bool) -> Self {
Scalar::Boolean(value)
}
}
impl From<i64> for Scalar {
fn from(value: i64) -> Self {
Scalar::Integer(value)
}
}
impl From<Vec<u8>> for Scalar {
fn from(value: Vec<u8>) -> Self {
Scalar::Binary(value)
}
}
impl From<String> for Scalar {
fn from(value: String) -> Self {
Scalar::String(value)
}
}
impl From<&str> for Scalar {
fn from(value: &str) -> Self {
Scalar::String(value.to_string())
}
}
impl Display for Scalar {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Scalar::Boolean(value) => write!(f, "BOOLEAN({value})"),
Scalar::Integer(value) => write!(f, "INTEGER({value})"),
Scalar::Binary(value) => write!(f, "BINARY({value:?})"),
Scalar::String(value) => write!(f, "STRING({value})"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ty() {
let scalar = Scalar::Boolean(true);
assert_eq!(scalar.ty(), ScalarType::Boolean);
let scalar = Scalar::Integer(42);
assert_eq!(scalar.ty(), ScalarType::Integer);
let scalar = Scalar::Binary(vec![1, 2, 3]);
assert_eq!(scalar.ty(), ScalarType::Binary);
let scalar = Scalar::String(String::from("Hello"));
assert_eq!(scalar.ty(), ScalarType::String);
}
#[test]
fn test_scalar_variants_are_not_equal() {
assert_ne!(Scalar::Boolean(true), Scalar::Integer(1));
}
#[test]
fn test_from_i64_creates_integer_scalar() {
let scalar = Scalar::from(42_i64);
assert_eq!(scalar, Scalar::Integer(42));
}
#[test]
fn test_from_vec_u8_creates_binary_scalar() {
let scalar = Scalar::from(vec![1, 2, 3]);
assert_eq!(scalar, Scalar::Binary(vec![1, 2, 3]));
}
#[test]
fn test_from_string_creates_string_scalar() {
let scalar = Scalar::from(String::from("Monica"));
assert_eq!(scalar, Scalar::String(String::from("Monica")));
}
#[test]
fn test_from_str_creates_string_scalar() {
let scalar = Scalar::from("Erica");
assert_eq!(scalar, Scalar::String(String::from("Erica")));
}
}