use crate::column::core::ColumnType;
use crate::column::flags::ColumnFlag;
use crate::traits::column_like::ColumnLike;
use serde_json::Value;
use std::collections::HashSet;
use std::marker::PhantomData;
use vantage_expressions::{Expression, Expressive, expr_any};
#[derive(Debug, Clone)]
pub struct MockColumn<T = Value>
where
T: ColumnType,
{
name: String,
flags: HashSet<ColumnFlag>,
_phantom: PhantomData<T>,
}
impl<T: ColumnType> MockColumn<T> {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
flags: HashSet::new(),
_phantom: PhantomData,
}
}
pub fn into_type<T2: ColumnType>(self) -> MockColumn<T2>
where
T: ColumnType,
{
MockColumn::<T2> {
name: self.name,
flags: self.flags,
_phantom: PhantomData,
}
}
}
impl<T: ColumnType> Expressive<T> for MockColumn<T> {
fn expr(&self) -> Expression<T> {
expr_any!(self.name.clone())
}
}
impl<T: ColumnType> ColumnLike<T> for MockColumn<T> {
fn name(&self) -> &str {
&self.name
}
fn flags(&self) -> HashSet<ColumnFlag> {
self.flags.clone()
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn into_any(self: Box<Self>) -> Box<dyn std::any::Any> {
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mock_column_basic() {
let col = MockColumn::<Value>::new("test_column");
assert_eq!(col.name(), "test_column");
assert_eq!(col.alias(), None);
}
}