use crate::dataset::DataToken;
use dicom_core::error::Error as CoreError;
pub use dicom_core::error::{CastValueError, InvalidValueReadError};
use dicom_encoding::error::{Error as EncodingError, TextEncodingError};
use quick_error::quick_error;
use std::error::Error as BaseError;
use std::fmt;
use std::io;
pub type Result<T> = ::std::result::Result<T, Error>;
quick_error! {
#[derive(Debug)]
pub enum Error {
InvalidFormat {
description("Content is not DICOM or is corrupted")
}
UnexpectedElement {
description("Unexpected DICOM element in current reading position")
}
UnexpectedDataValueLength {
description("Inconsistent data value length in data element")
}
IllegalDataRead {
description("Illegal data value read")
}
UnsupportedTransferSyntax {
description("Unsupported transfer syntax")
}
UnsupportedCharacterSet {
description("Unsupported character set")
}
NoSuchAttributeName {
description("No such attribute name")
}
NoSuchDataElement {
description("No such data element")
}
PixelDataOutOfBounds {
description("Pixel data access index out of bounds")
}
MissingElementValue {
description("Expected value after data element header, but was missing")
}
DataSetSyntax(err: DataSetSyntaxError) {
description("Data set syntax error")
from()
cause(err)
display(self_) -> ("{}: {}", self_.description(), err.description())
}
ReadValue(err: InvalidValueReadError) {
description("Invalid value read")
from()
cause(err)
display(self_) -> ("{}: {}", self_.description(), err.description())
}
TextEncoding(err: TextEncodingError) {
description("Failed text encoding/decoding")
from()
cause(err)
display(self_) -> ("{}: {}", self_.description(), err.description())
}
CastValue(err: CastValueError) {
description("Failed value cast")
from()
cause(err)
display(self_) -> ("{}: {}", self_.description(), err.description())
}
Io(err: io::Error) {
description("I/O error")
from()
cause(err)
display(self_) -> ("{}: {}", self_.description(), err.description())
}
}
}
impl From<CoreError> for Error {
fn from(e: CoreError) -> Self {
match e {
CoreError::UnexpectedDataValueLength => Error::UnexpectedDataValueLength,
CoreError::UnexpectedElement => Error::UnexpectedElement,
CoreError::ReadValue(e) => Error::ReadValue(e),
CoreError::CastValue(e) => Error::CastValue(e),
}
}
}
impl From<EncodingError> for Error {
fn from(e: EncodingError) -> Self {
match e {
EncodingError::UnexpectedElement => Error::UnexpectedElement,
EncodingError::UnexpectedDataValueLength => Error::UnexpectedDataValueLength,
EncodingError::ReadValue(e) => Error::ReadValue(e),
EncodingError::TextEncoding(e) => Error::TextEncoding(e),
EncodingError::CastValue(e) => Error::CastValue(e),
EncodingError::Io(e) => Error::Io(e),
}
}
}
#[derive(Debug)]
pub enum DataSetSyntaxError {
PrematureEnd,
UnexpectedToken(DataToken),
}
impl fmt::Display for DataSetSyntaxError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
DataSetSyntaxError::PrematureEnd => f.write_str(self.description()),
DataSetSyntaxError::UnexpectedToken(ref token) => {
write!(f, "{} {}", self.description(), token)
}
}
}
}
impl ::std::error::Error for DataSetSyntaxError {
fn description(&self) -> &str {
match self {
DataSetSyntaxError::PrematureEnd => "data set ended prematurely",
DataSetSyntaxError::UnexpectedToken(_) => "unexpected data set token",
}
}
}