use crate::util::{b2s};
use std::error;
use std::fmt;
use jedec::*;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum XC2BitError {
JedParseError(JedParserError),
BadDeviceName(String),
WrongFuseCount,
UnsupportedOeConfiguration((bool, bool, bool, bool)),
UnsupportedZIAConfiguration(Vec<bool>),
}
impl From<JedParserError> for XC2BitError {
fn from(err: JedParserError) -> Self {
XC2BitError::JedParseError(err)
}
}
impl error::Error for XC2BitError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
&XC2BitError::JedParseError(ref err) => Some(err),
&XC2BitError::BadDeviceName(_) => None,
&XC2BitError::WrongFuseCount => None,
&XC2BitError::UnsupportedOeConfiguration(_) => None,
&XC2BitError::UnsupportedZIAConfiguration(_) => None,
}
}
}
impl fmt::Display for XC2BitError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
&XC2BitError::JedParseError(err) => {
write!(f, ".jed parsing failed: {}", err)
},
&XC2BitError::BadDeviceName(ref devname) => {
write!(f, "device name \"{}\" is invalid/unsupported", devname)
},
&XC2BitError::WrongFuseCount => {
write!(f, "wrong number of fuses")
},
&XC2BitError::UnsupportedOeConfiguration(bits) => {
write!(f, "unknown Oe field value {}{}{}{}",
b2s(bits.0), b2s(bits.1),
b2s(bits.2), b2s(bits.3))
},
&XC2BitError::UnsupportedZIAConfiguration(ref bits) => {
write!(f, "unknown ZIA selection bit pattern ")?;
for &bit in bits {
write!(f, "{}", b2s(bit))?;
}
Ok(())
},
}
}
}