pub mod hfbi;
pub mod niseci;
pub enum JsonDispatchError {
Io(std::io::Error),
JsonArray(serde_json::Error),
}
#[derive(Debug)]
pub enum JsonDeserError {
Io(std::io::Error),
Json(Vec<serde_json::Error>),
JsonArray(serde_json::Error),
}
impl From<JsonDispatchError> for JsonDeserError {
fn from(err: JsonDispatchError) -> Self {
match err {
JsonDispatchError::Io(e) => JsonDeserError::Io(e),
JsonDispatchError::JsonArray(errs) => JsonDeserError::JsonArray(errs),
}
}
}
pub enum JsonPathCheckError {
Io(std::io::Error),
DeserIo(std::io::Error),
Json(Vec<serde_json::Error>),
JsonArray(serde_json::Error),
}
impl From<std::io::Error> for JsonPathCheckError {
fn from(err: std::io::Error) -> Self {
JsonPathCheckError::Io(err)
}
}
impl From<JsonDeserError> for JsonPathCheckError {
fn from(err: JsonDeserError) -> Self {
match err {
JsonDeserError::Json(errs) => JsonPathCheckError::Json(errs),
JsonDeserError::JsonArray(err) => JsonPathCheckError::JsonArray(err),
JsonDeserError::Io(e) => JsonPathCheckError::DeserIo(e),
}
}
}
use serde::de::DeserializeOwned;
use serde_json::Deserializer;
use std::io::{BufRead, BufReader, Read};
fn dispatch_json_input<R, T, FArray, FStream, Out>(
reader: R,
array_fn: FArray,
stream_fn: FStream,
) -> Out
where
R: Read,
T: DeserializeOwned,
FArray: FnOnce(Result<Vec<T>, JsonDispatchError>) -> Out,
FStream: FnOnce(Deserializer<serde_json::de::IoRead<BufReader<R>>>) -> Out,
{
let mut reader = BufReader::new(reader);
let peek = match reader.fill_buf() {
Ok(buf) => buf,
Err(e) => {
return array_fn(Err(JsonDispatchError::Io(e)));
}
};
let first = peek.iter().copied().find(|b| !b.is_ascii_whitespace());
match first {
Some(b'[') => {
let res = serde_json::from_reader::<_, Vec<T>>(reader)
.map_err(|e| JsonDispatchError::JsonArray(e));
array_fn(res)
}
_ => {
let iter = Deserializer::from_reader(reader);
stream_fn(iter)
}
}
}