use std::io::{BufRead, BufReader, Read};
use serde_json::Value;
use crate::error::{ArrowError, Result};
#[derive(Debug)]
pub(super) struct ValueIter<'a, R: Read> {
reader: &'a mut BufReader<R>,
max_read_records: Option<usize>,
record_count: usize,
line_buf: String,
}
impl<'a, R: Read> ValueIter<'a, R> {
pub fn new(reader: &'a mut BufReader<R>, max_read_records: Option<usize>) -> Self {
Self {
reader,
max_read_records,
record_count: 0,
line_buf: String::new(),
}
}
}
impl<'a, R: Read> Iterator for ValueIter<'a, R> {
type Item = Result<Value>;
fn next(&mut self) -> Option<Self::Item> {
if let Some(max) = self.max_read_records {
if self.record_count >= max {
return None;
}
}
loop {
self.line_buf.truncate(0);
match self.reader.read_line(&mut self.line_buf) {
Ok(0) => {
return None;
}
Err(e) => {
return Some(Err(ArrowError::from(e)));
}
_ => {
let trimmed_s = self.line_buf.trim();
if trimmed_s.is_empty() {
continue;
}
self.record_count += 1;
return Some(serde_json::from_str(trimmed_s).map_err(ArrowError::from));
}
}
}
}
}