use crate::StreamPosition;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Char {
Eof,
NoData,
Char(char)
}
impl std::fmt::Display for Char {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
use std::fmt::Write; match self {
Char::Eof => write!(f, "<EOF>"),
Char::NoData => write!(f, "<NoData>"),
Char::Char(ch) => f.write_char(*ch),
}
}
}
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
IoError(std::io::Error),
MalformedUtf8(StreamPosition, usize),
}
impl Error {
pub fn malformed_utf8<T>(stream_pos:StreamPosition, num_bytes:usize) -> Result<T> {
Err(Self::MalformedUtf8(stream_pos, num_bytes))
}
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Error::IoError(e)
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Error::MalformedUtf8(pos, n) => write!(f, "malformed UTF-8 of {} bytes at {}", n, pos),
Error::IoError(e) => write!(f, "IO error: {}", e),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::IoError(e) => Some(e),
_ => None,
}
}
}