mod serialize;
use super::super::iterator::StreamingIterator;
use std::io::Write;
pub use serialize::*;
use crate::array::Array;
use crate::chunk::Chunk;
use crate::error::Result;
fn new_serializers<'a, A: AsRef<dyn Array>>(
columns: &'a [A],
options: &'a SerializeOptions,
) -> Result<Vec<Box<dyn StreamingIterator<Item = [u8]> + 'a>>> {
columns
.iter()
.map(|column| new_serializer(column.as_ref(), options))
.collect()
}
pub fn serialize<A: AsRef<dyn Array>>(
chunk: &Chunk<A>,
options: &SerializeOptions,
) -> Result<Vec<Vec<u8>>> {
let mut serializers = new_serializers(chunk, options)?;
let mut rows = Vec::with_capacity(chunk.len());
let mut row = vec![];
(0..chunk.len()).try_for_each(|_| {
serializers
.iter_mut()
.for_each(|iter| {
let field = iter.next().unwrap();
row.extend_from_slice(field);
row.push(options.delimiter);
});
if !row.is_empty() {
let last_byte = row.len() - 1;
row[last_byte] = b'\n';
rows.push(std::mem::take(&mut row));
}
Result::Ok(())
})?;
Ok(rows)
}
pub fn write_chunk<W: Write, A: AsRef<dyn Array>>(
writer: &mut W,
columns: &Chunk<A>,
options: &SerializeOptions,
) -> Result<()> {
let mut serializers = new_serializers(columns.arrays(), options)?;
let rows = columns.len();
let mut row = Vec::with_capacity(columns.arrays().len() * 10);
(0..rows).try_for_each(|_| {
serializers
.iter_mut()
.for_each(|iter| {
let field = iter.next().unwrap();
row.extend_from_slice(field);
row.push(options.delimiter);
});
let last_byte = row.len() - 1;
row[last_byte] = b'\n';
writer.write_all(&row)?;
row.clear();
Result::Ok(())
})?;
Ok(())
}
pub fn write_header<W: Write, T>(
writer: &mut W,
names: &[T],
options: &SerializeOptions,
) -> Result<()>
where
T: AsRef<str>,
{
let names = names.iter().map(|x| x.as_ref()).collect::<Vec<_>>();
writer.write_all(
names
.join(std::str::from_utf8(&[options.delimiter]).unwrap())
.as_bytes(),
)?;
writer.write_all(&[b'\n'])?;
Ok(())
}