use std::{marker::PhantomData, ptr::NonNull};
use serde::{
de::{DeserializeSeed, IntoDeserializer, MapAccess, SeqAccess, Visitor},
Deserializer,
};
use crate::{
common::{BorrowedValue, Value},
RawBlock,
};
pub struct IntoRowsIter<'a> {
pub(crate) raw: RawBlock,
pub(crate) row: usize,
pub(crate) _marker: PhantomData<&'a bool>,
}
unsafe impl<'a> Send for IntoRowsIter<'a> {}
unsafe impl<'a> Sync for IntoRowsIter<'a> {}
impl<'a> Iterator for IntoRowsIter<'a> {
type Item = RowView<'a>;
fn next(&mut self) -> Option<Self::Item> {
if self.row >= self.raw.nrows() {
None
} else {
let row = self.row;
self.row += 1;
Some(RowView {
raw: unsafe { &*(&self.raw as *const RawBlock) },
row,
col: 0,
})
}
}
}
pub struct RowsIter<'a> {
pub(super) raw: NonNull<RawBlock>,
pub(super) row: usize,
pub(crate) _marker: PhantomData<&'a usize>,
}
unsafe impl<'a> Send for RowsIter<'a> {}
unsafe impl<'a> Sync for RowsIter<'a> {}
impl<'a> Iterator for RowsIter<'a> {
type Item = RowView<'a>;
fn next(&mut self) -> Option<Self::Item> {
if self.row >= unsafe { self.raw.as_mut() }.nrows() {
None
} else {
let row = self.row;
self.row += 1;
Some(RowView {
raw: unsafe { self.raw.as_mut() },
row,
col: 0,
})
}
}
}
impl<'a> RowsIter<'a> {
pub fn values(&mut self) -> ValueIter {
ValueIter {
raw: unsafe { self.raw.as_mut() },
row: self.row,
col: 0,
}
}
pub fn named_values(&mut self) -> RowView {
RowView {
raw: unsafe { self.raw.as_mut() },
row: self.row,
col: 0,
}
}
}
pub struct ValueIter<'a> {
raw: &'a RawBlock,
row: usize,
col: usize,
}
impl<'a> Iterator for ValueIter<'a> {
type Item = BorrowedValue<'a>;
fn next(&mut self) -> Option<Self::Item> {
if self.col >= self.raw.ncols() {
None
} else {
unsafe {
let col = self.col;
self.col += 1;
Some(self.raw.get_ref_unchecked(self.row, col))
}
}
}
}
pub struct RowView<'a> {
raw: &'a RawBlock,
row: usize,
col: usize,
}
impl<'a> Iterator for RowView<'a> {
type Item = (&'a str, BorrowedValue<'a>);
fn next(&mut self) -> Option<Self::Item> {
if self.col >= self.raw.ncols() {
None
} else {
unsafe {
let col = self.col;
self.col += 1;
Some((
self.raw.fields.get_unchecked(col).as_str(),
self.raw.get_ref_unchecked(self.row, col),
))
}
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let max = self.raw.ncols();
if self.col < max {
let hint = max - self.col;
(hint, Some(hint))
} else {
(0, Some(0))
}
}
}
impl<'a> ExactSizeIterator for RowView<'a> {}
impl<'a> std::fmt::Debug for RowView<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RowView")
.field("raw", &self.raw)
.field("row", &self.row)
.field("col", &self.col)
.finish()
}
}
pub struct RowViewOfValue<'a>(RowView<'a>);
impl<'a> Iterator for RowViewOfValue<'a> {
type Item = BorrowedValue<'a>;
fn next(&mut self) -> Option<Self::Item> {
if self.0.col >= self.0.raw.ncols() {
None
} else {
unsafe {
let col = self.0.col;
self.0.col += 1;
Some(self.0.raw.get_ref_unchecked(self.0.row, col))
}
}
}
}
impl<'a> RowView<'a> {
pub fn into_value_iter(self) -> RowViewOfValue<'a> {
RowViewOfValue(self)
}
fn walk_next(&mut self) -> Option<BorrowedValue<'a>> {
self.next().map(|(_, v)| v)
}
fn peek_name(&self) -> Option<&'a str> {
self.raw.fields.get(self.col).map(|s| s.as_str())
}
pub fn into_values(self) -> Vec<Value> {
self.map(|(_, b)| b.to_value()).collect()
}
}
pub(super) type DeError = taos_error::Error;
impl<'de, 'a: 'de> SeqAccess<'de> for RowView<'a> {
type Error = DeError;
fn next_element_seed<S>(&mut self, seed: S) -> Result<Option<S::Value>, Self::Error>
where
S: DeserializeSeed<'de>,
{
match self.next() {
Some((_, v)) => seed
.deserialize(v)
.map_err(<Self::Error as serde::de::Error>::custom)
.map(Some),
None => Ok(None),
}
}
}
impl<'de, 'a: 'de> MapAccess<'de> for RowView<'a> {
type Error = DeError;
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
where
K: DeserializeSeed<'de>,
{
match self.peek_name() {
Some(name) => seed.deserialize(name.into_deserializer()).map(Some),
_ => Ok(None),
}
}
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
where
V: DeserializeSeed<'de>,
{
seed.deserialize(&mut *self)
.map_err(<Self::Error as serde::de::Error>::custom)
}
}
impl<'de, 'a: 'de> Deserializer<'de> for &mut RowView<'a> {
type Error = DeError;
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.walk_next() {
Some(v) => v
.deserialize_any(visitor)
.map_err(<Self::Error as serde::de::Error>::custom),
None => Err(<Self::Error as serde::de::Error>::custom(
"expect value, not none",
)),
}
}
serde::forward_to_deserialize_any! {
bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char bytes byte_buf enum
identifier ignored_any
}
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.walk_next() {
Some(v) => v
.deserialize_str(visitor)
.map_err(<Self::Error as serde::de::Error>::custom),
None => Err(<Self::Error as serde::de::Error>::custom(
"expect value, not none",
)),
}
}
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_str(visitor)
}
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.walk_next() {
Some(v) => {
if v.is_null() {
visitor.visit_none()
} else {
visitor
.visit_some(v)
.map_err(<Self::Error as serde::de::Error>::custom)
}
}
_ => Err(<Self::Error as serde::de::Error>::custom(
"expect next value",
)),
}
}
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.walk_next() {
Some(_v) => visitor.visit_unit(),
_ => Err(<Self::Error as serde::de::Error>::custom(
"there's no enough value",
)),
}
}
fn deserialize_unit_struct<V>(
self,
_name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_unit(visitor)
}
fn deserialize_newtype_struct<V>(
self,
_name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_newtype_struct(self)
}
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_seq(self)
}
fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_seq(self)
}
fn deserialize_tuple_struct<V>(
self,
_name: &'static str,
_len: usize,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_seq(visitor)
}
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
if self.raw.fields.is_empty() {
return visitor.visit_seq(self);
}
visitor.visit_map(self)
}
fn deserialize_struct<V>(
self,
_name: &'static str,
_fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_map(visitor)
}
}