#[derive(Debug, Clone)]
pub enum Value {
Null,
I64(i64),
U64(u64),
F64(f64),
Date(DateValue),
Time(TimeValue),
DateTime(DateTimeValue),
DateTimeTz(DateTimeTzValue),
Uuid([u8; 16]),
Bytes(Vec<u8>),
String(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DateValue {
pub year: i32,
pub month: u8,
pub day: u8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct TimeValue {
pub hour: u8,
pub minute: u8,
pub second: u8,
pub microsecond: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DateTimeValue {
pub date: DateValue,
pub time: TimeValue,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DateTimeTzValue {
pub datetime: DateTimeValue,
pub offset_seconds: i32,
}
#[derive(Debug, Clone, Copy)]
pub enum ValueRef<'a> {
Null,
I64(i64),
U64(u64),
F64(f64),
Date(DateValue),
Time(TimeValue),
DateTime(DateTimeValue),
DateTimeTz(DateTimeTzValue),
Uuid(&'a [u8; 16]),
Bytes(&'a [u8]),
String(&'a str),
}
pub trait ParamSource {
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn value_at(&self, index: usize) -> ValueRef<'_>;
}
pub(super) struct ParamRefSlice<'a>(pub(super) &'a [ValueRef<'a>]);
impl ParamSource for ParamRefSlice<'_> {
fn len(&self) -> usize {
self.0.len()
}
fn value_at(&self, index: usize) -> ValueRef<'_> {
self.0[index]
}
}
pub(super) fn values_as_refs(values: &[Value]) -> Vec<ValueRef<'_>> {
values
.iter()
.map(|value| match value {
Value::Null => ValueRef::Null,
Value::I64(value) => ValueRef::I64(*value),
Value::U64(value) => ValueRef::U64(*value),
Value::F64(value) => ValueRef::F64(*value),
Value::Date(value) => ValueRef::Date(*value),
Value::Time(value) => ValueRef::Time(*value),
Value::DateTime(value) => ValueRef::DateTime(*value),
Value::DateTimeTz(value) => ValueRef::DateTimeTz(*value),
Value::Uuid(value) => ValueRef::Uuid(value),
Value::Bytes(value) => ValueRef::Bytes(value),
Value::String(value) => ValueRef::String(value),
})
.collect()
}