use crate::de::FitObject;
use std::error::Error as StdError;
use std::io;
use std::{error, fmt};
pub type Result<T> = ::std::result::Result<T, Error>;
pub type Error = Box<ErrorKind>;
#[derive(Debug)]
pub enum ErrorKind {
InvalidCrc((Vec<u8>, FitObject, u16, u16)),
Io(io::Error),
MissingDefinitionMessage(u8, usize),
TrailingBytes(usize),
ParseError(usize, nom::error::ErrorKind),
UnexpectedEof(nom::Needed),
ValueError(String),
MissingDeveloperDefinitionMessage(),
}
impl StdError for ErrorKind {
fn cause(&self) -> Option<&dyn error::Error> {
match *self {
ErrorKind::InvalidCrc(..) => None,
ErrorKind::Io(ref err) => Some(err),
ErrorKind::MissingDefinitionMessage(..) => None,
ErrorKind::TrailingBytes(_) => None,
ErrorKind::ParseError(..) => None, ErrorKind::UnexpectedEof(..) => None,
ErrorKind::ValueError(..) => None,
ErrorKind::MissingDeveloperDefinitionMessage(..) => None,
}
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Error {
ErrorKind::Io(err).into()
}
}
impl fmt::Display for ErrorKind {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match self {
ErrorKind::InvalidCrc((_, obj, exp_val, calc_val)) => match obj {
FitObject::Header(_) => write!(
fmt,
"CRC value for header did not match, expected value {}, calculated value {}",
exp_val, calc_val
),
_ => write!(
fmt,
"CRC value for data did not match, expected value {}, calculated value {}",
exp_val, calc_val
),
},
ErrorKind::Io(ref ioerr) => write!(fmt, "io error: {}", ioerr),
ErrorKind::TrailingBytes(rem) => {
write!(fmt, "{} bytes remain past expected EOF location", rem)
}
ErrorKind::MissingDefinitionMessage(local_number, position) => write!(
fmt,
"No definition found for local message number {} at position {:#x}",
local_number, position
),
ErrorKind::ParseError(pos, ref err) => write!(
fmt,
"parser error: '{}' at position: {:#x}",
err.description(),
pos
),
ErrorKind::UnexpectedEof(nom::Needed::Size(n)) => {
write!(fmt, "parser error: requires {} more bytes", n)
}
ErrorKind::UnexpectedEof(nom::Needed::Unknown) => {
write!(fmt, "parser error: requires more data")
}
ErrorKind::ValueError(ref message) => write!(fmt, "value error: {}", message),
ErrorKind::MissingDeveloperDefinitionMessage() => {
write!(fmt, "developer field referenced before being defined")
}
}
}
}