use std::ops::Range;
use crate::{columnar::encoding::DecodeColumnError, ScalarValue};
use super::{ValueIter, ValueRange};
mod simple;
use simple::SimpleColIter;
pub(crate) use simple::SimpleColRange;
mod group;
use group::GroupIter;
pub(crate) use group::{GroupRange, GroupedColumnRange};
#[derive(Debug, Clone)]
pub(crate) enum GenericColumnRange {
Simple(SimpleColRange),
Value(ValueRange),
Group(GroupRange),
}
impl GenericColumnRange {
pub(crate) fn range(&self) -> Range<usize> {
match self {
Self::Simple(sc) => sc.range(),
Self::Value(v) => v.range(),
Self::Group(g) => g.range(),
}
}
}
#[allow(dead_code)]
pub(crate) enum CellValue {
Simple(SimpleValue),
Group(Vec<Vec<SimpleValue>>),
}
#[allow(dead_code)]
pub(crate) enum SimpleValue {
Uint(Option<u64>),
Int(Option<i64>),
String(Option<smol_str::SmolStr>),
Bool(bool),
Value(ScalarValue),
}
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub(crate) enum GenericColIter<'a> {
Simple(SimpleColIter<'a>),
Value(ValueIter<'a>),
Group(GroupIter<'a>),
}
impl GenericColIter<'_> {
fn try_next(&mut self) -> Result<Option<CellValue>, DecodeColumnError> {
match self {
Self::Simple(s) => s
.next()
.transpose()
.map_err(|e| DecodeColumnError::decode_raw("a simple column", e))
.map(|v| v.map(CellValue::Simple)),
Self::Value(v) => v
.next()
.transpose()
.map(|v| v.map(|v| CellValue::Simple(SimpleValue::Value(v)))),
Self::Group(g) => g.next().transpose(),
}
}
}
impl Iterator for GenericColIter<'_> {
type Item = Result<CellValue, DecodeColumnError>;
fn next(&mut self) -> Option<Self::Item> {
self.try_next().transpose()
}
}