#[cfg(feature = "generalized")]
pub use crate::generalized::parser::*;
use crate::model::{Quad, Triple};
use std::error::Error;
pub trait TriplesParser: Sized {
type Error: Error;
fn parse_all<E: From<Self::Error>>(
&mut self,
on_triple: &mut impl FnMut(Triple<'_>) -> Result<(), E>,
) -> Result<(), E> {
while !self.is_end() {
self.parse_step(on_triple)?;
}
Ok(())
}
fn parse_step<E: From<Self::Error>>(
&mut self,
on_triple: &mut impl FnMut(Triple<'_>) -> Result<(), E>,
) -> Result<(), E>;
fn is_end(&self) -> bool;
fn into_iter<T, E: From<Self::Error>, F: FnMut(Triple<'_>) -> Result<T, E>>(
self,
convert_triple: F,
) -> TriplesParserIterator<T, E, F, Self> {
TriplesParserIterator {
parser: self,
buffer: Vec::default(),
convert_triple,
}
}
}
pub struct TriplesParserIterator<
T,
E: From<P::Error>,
F: FnMut(Triple<'_>) -> Result<T, E>,
P: TriplesParser,
> {
parser: P,
buffer: Vec<T>,
convert_triple: F,
}
impl<T, E: From<P::Error>, F: FnMut(Triple<'_>) -> Result<T, E>, P: TriplesParser> Iterator
for TriplesParserIterator<T, E, F, P>
{
type Item = Result<T, E>;
fn next(&mut self) -> Option<Result<T, E>> {
loop {
if let Some(r) = self.buffer.pop() {
return Some(Ok(r));
}
if self.parser.is_end() {
return None;
}
let buffer = &mut self.buffer;
let convert_triple = &mut self.convert_triple;
if let Err(e) = self
.parser
.parse_step(&mut |t| convert_triple(t).map(|t| buffer.push(t)))
{
return Some(Err(e));
}
}
}
}
pub trait QuadsParser: Sized {
type Error: Error;
fn parse_all<E: From<Self::Error>>(
&mut self,
on_quad: &mut impl FnMut(Quad<'_>) -> Result<(), E>,
) -> Result<(), E> {
while !self.is_end() {
self.parse_step(on_quad)?
}
Ok(())
}
fn parse_step<E: From<Self::Error>>(
&mut self,
on_quad: &mut impl FnMut(Quad<'_>) -> Result<(), E>,
) -> Result<(), E>;
fn is_end(&self) -> bool;
fn into_iter<T, E: From<Self::Error>, F: FnMut(Quad<'_>) -> Result<T, E>>(
self,
convert_quad: F,
) -> QuadsParserIterator<T, E, F, Self> {
QuadsParserIterator {
parser: self,
buffer: Vec::default(),
convert_quad,
}
}
}
pub struct QuadsParserIterator<
T,
E: From<P::Error>,
F: FnMut(Quad<'_>) -> Result<T, E>,
P: QuadsParser,
> {
parser: P,
buffer: Vec<T>,
convert_quad: F,
}
impl<T, E: From<P::Error>, F: FnMut(Quad<'_>) -> Result<T, E>, P: QuadsParser> Iterator
for QuadsParserIterator<T, E, F, P>
{
type Item = Result<T, E>;
fn next(&mut self) -> Option<Result<T, E>> {
loop {
if let Some(r) = self.buffer.pop() {
return Some(Ok(r));
}
if self.parser.is_end() {
return None;
}
let buffer = &mut self.buffer;
let convert_quad = &mut self.convert_quad;
if let Err(e) = self
.parser
.parse_step(&mut |q| convert_quad(q).map(|q| buffer.push(q)))
{
return Some(Err(e));
}
}
}
}
pub trait ParseError: Error {
fn textual_position(&self) -> Option<LineBytePosition>;
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub struct LineBytePosition {
line_number: u64,
byte_number: u64,
}
impl LineBytePosition {
pub fn new(line_number: u64, byte_number: u64) -> Self {
Self {
line_number,
byte_number,
}
}
pub fn line_number(&self) -> u64 {
self.line_number
}
pub fn byte_number(&self) -> u64 {
self.byte_number
}
}