use crate::error::ErrorCode;
use crate::json::parser::Parser;
use crate::json::traits::Read;
use crate::options::Options;
use super::StreamError;
use super::split::Splitter;
pub(crate) type Window = crate::stream::Window<Splitter>;
pub(crate) fn parse<'a, O: Options, T: Read<'a> + Default>(
win: &'a Window,
span: (usize, usize),
) -> Result<T, StreamError> {
let mut value = T::default();
parse_into::<O, T>(win, span, &mut value)?;
Ok(value)
}
pub(crate) fn parse_into<'a, O: Options, T: Read<'a>>(
win: &'a Window,
(start, end): (usize, usize),
value: &mut T,
) -> Result<(), StreamError> {
let text = core::str::from_utf8(&win.bytes()[start..end])
.map_err(|e| win.error_at(ErrorCode::InvalidUtf8, start + e.valid_up_to(), None))?;
let mut p = Parser::<O>::with_options(text);
match p.read(value).and_then(|()| p.finish()) {
Ok(()) => Ok(()),
Err(code) => Err(win.error_at(code, start + p.position(), p.error_key())),
}
}