#![deny(missing_docs)]
use serde::{Deserialize, Serialize};
use marrow::{datatypes::Field, error::MarrowError, view::View};
use crate::{
_impl::arrow2::{array::Array, datatypes::Field as ArrowField},
internal::{
array_builder::ArrayBuilder,
deserializer::Deserializer,
error::{fail, Error, Result},
schema::{SchemaLike, Sealed, SerdeArrowSchema, TracingOptions},
serializer::Serializer,
},
};
pub fn to_arrow2<T: Serialize>(fields: &[ArrowField], items: T) -> Result<Vec<Box<dyn Array>>> {
let builder = ArrayBuilder::from_arrow2(fields)?;
items
.serialize(Serializer::new(builder))?
.into_inner()
.to_arrow2()
}
pub fn from_arrow2<'de, T, A>(fields: &[ArrowField], arrays: &'de [A]) -> Result<T>
where
T: Deserialize<'de>,
A: AsRef<dyn Array>,
{
let deserializer = Deserializer::from_arrow2(fields, arrays)?;
T::deserialize(deserializer)
}
impl crate::internal::array_builder::ArrayBuilder {
pub fn from_arrow2(fields: &[ArrowField]) -> Result<Self> {
Self::new(SerdeArrowSchema::try_from(fields)?)
}
pub fn to_arrow2(&mut self) -> Result<Vec<Box<dyn Array>>> {
Ok(self
.to_marrow()?
.into_iter()
.map(Box::<dyn Array>::try_from)
.collect::<Result<_, MarrowError>>()?)
}
}
impl<'de> Deserializer<'de> {
pub fn from_arrow2<A>(fields: &[ArrowField], arrays: &'de [A]) -> Result<Self>
where
A: AsRef<dyn Array>,
{
if fields.len() != arrays.len() {
fail!(
"different number of fields ({}) and arrays ({})",
fields.len(),
arrays.len()
);
}
let fields = fields
.iter()
.map(Field::try_from)
.collect::<Result<Vec<_>, MarrowError>>()?;
let views = arrays
.iter()
.map(|array| View::try_from(array.as_ref()))
.collect::<Result<Vec<_>, MarrowError>>()?;
Deserializer::new(&fields, views)
}
}
impl TryFrom<SerdeArrowSchema> for Vec<ArrowField> {
type Error = Error;
fn try_from(value: SerdeArrowSchema) -> Result<Self> {
Vec::<ArrowField>::try_from(&value)
}
}
impl<'a> TryFrom<&'a SerdeArrowSchema> for Vec<ArrowField> {
type Error = Error;
fn try_from(value: &'a SerdeArrowSchema) -> Result<Self> {
Ok(value
.fields
.iter()
.map(ArrowField::try_from)
.collect::<Result<_, MarrowError>>()?)
}
}
impl<'a> TryFrom<&'a [ArrowField]> for SerdeArrowSchema {
type Error = Error;
fn try_from(fields: &'a [ArrowField]) -> std::prelude::v1::Result<Self, Self::Error> {
Ok(Self {
fields: fields
.iter()
.map(Field::try_from)
.collect::<Result<_, MarrowError>>()?,
})
}
}
impl Sealed for Vec<ArrowField> {}
impl SchemaLike for Vec<ArrowField> {
fn from_value<T: serde::Serialize>(value: T) -> Result<Self> {
SerdeArrowSchema::from_value(value)?.try_into()
}
fn from_type<'de, T: serde::Deserialize<'de>>(options: TracingOptions) -> Result<Self> {
SerdeArrowSchema::from_type::<T>(options)?.try_into()
}
fn from_samples<T: serde::Serialize>(samples: T, options: TracingOptions) -> Result<Self> {
SerdeArrowSchema::from_samples(samples, options)?.try_into()
}
}