1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use dicom_core::error::Error as CoreError;
pub use dicom_core::error::{CastValueError, InvalidValueReadError};
use quick_error::quick_error;
use std::borrow::Cow;
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 {
UnexpectedElement {
description("Unexpected DICOM element in current reading position")
}
UnexpectedDataValueLength {
description("Inconsistent data value length in data element")
}
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),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct TextEncodingError(Cow<'static, str>);
impl TextEncodingError {
pub fn new<E: Into<Cow<'static, str>>>(cause: E) -> Self {
TextEncodingError(cause.into())
}
}
impl fmt::Display for TextEncodingError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}: {}", self.description(), self.0)
}
}
impl ::std::error::Error for TextEncodingError {
fn description(&self) -> &str {
"encoding/decoding process failed"
}
}