use crate::State;
use crate::error::Error;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct CollectErrors {
pub(crate) max: Option<usize>,
}
impl CollectErrors {
pub const fn new() -> CollectErrors {
CollectErrors { max: None }
}
pub const fn with_max_errors(max: usize) -> CollectErrors {
CollectErrors { max: Some(max) }
}
pub const fn set_max_errors(&mut self, max: usize) {
self.max = Some(max);
}
pub const fn max_errors(&self) -> Option<usize> {
self.max
}
}
#[derive(Debug, Default)]
pub struct CollectedErrors {
errors: Option<Error>,
}
impl CollectedErrors {
#[inline]
pub const fn new() -> CollectedErrors {
CollectedErrors { errors: None }
}
#[inline]
pub fn is_empty(&self) -> bool {
self.errors.is_none()
}
fn add(&mut self, err: Error) {
match self.errors {
Some(ref mut errors) => errors.push_error(err),
None => self.errors = Some(err),
}
}
#[cold]
pub fn collect(&mut self, err: Error, state: &mut State) -> Result<(), Error> {
let new = err.uncollected_count();
if new == 0 && state.collects_errors() || state.take_error_slots(new) {
self.add(state.error_in_context(err).mark_collected());
Ok(())
} else if self.errors.is_none() {
Err(err)
} else {
self.add(state.error_in_context(err));
Err(self.take().unwrap())
}
}
#[cold]
pub fn push(&mut self, err: Error, state: &State) {
self.add(state.error_in_context(err).mark_collected());
}
pub fn take(&mut self) -> Option<Error> {
self.errors.take()
}
#[inline(always)]
pub fn finish(&mut self) -> Result<(), Error> {
if self.errors.is_none() {
Ok(())
} else {
Err(self.take_cold())
}
}
#[cold]
#[inline(never)]
fn take_cold(&mut self) -> Error {
self.errors.take().unwrap()
}
}