ojcmp 0.4.0

online judge comparer
Documentation
mod normal;

#[deny(unsafe_code)]
mod strict;

#[deny(unsafe_code)]
mod float;

use std::panic::{catch_unwind, resume_unwind, UnwindSafe};
use std::{fmt, io, panic};

pub use self::float::try_float_compare;
pub use self::normal::try_normal_compare;
pub use self::strict::try_strict_compare;

#[allow(clippy::upper_case_acronyms)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Comparison {
    AC = 0,
    WA = 1,
    PE = 2,
}

#[derive(Debug)]
pub enum CompareError {
    Io(io::Error),
}

impl fmt::Display for CompareError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            CompareError::Io(e) => {
                write!(f, "CompareError::Io: {}", e)
            }
        }
    }
}

impl std::error::Error for CompareError {}

fn catch_io<R>(f: impl FnOnce() -> R + UnwindSafe) -> io::Result<R> {
    let hook = panic::take_hook();
    let ret = match catch_unwind(f) {
        Ok(ans) => Ok(ans),
        Err(payload) => match payload.downcast::<io::Error>() {
            Ok(e) => Err(*e),
            Err(payload) => resume_unwind(payload),
        },
    };
    panic::set_hook(hook);
    ret
}