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
use std::fmt;
use std::error::Error as StdError;
use reader::input_reader::InputChars;

/// Different types of errors that can occur.
#[derive(Debug)]
pub enum ErrorType {
  /// RDF writer produces invalid RDF (e.g. if invalid node types are provided).
  InvalidWriterOutput,

  /// RDF lexer reads invalid RDF (e.g. non-closing string).
  InvalidReaderInput,

  /// RDF reader reads an invalid token (e.g. invalid node type).
  InvalidToken,

  /// RDF reader reaches the end of the input and stores the characters that were read last.
  EndOfInput(InputChars),

  /// Input reader encounters invalid byte encoding.
  InvalidByteEncoding,

  /// Incorrect namespace.
  InvalidNamespace
}


/// An error related to the rdf-rs module.
#[derive(Debug)]
pub struct Error {
  error_type: ErrorType,
  error: Box<StdError>
}


impl Error {
  /// Constructor of `Error`.
  pub fn new<E>(error_type: ErrorType, error: E) -> Error
    where E: Into<Box<StdError>> {
    Error {
      error_type: error_type,
      error: error.into()
    }
  }

  /// Returns the type of the error.
  pub fn error_type(&self) -> &ErrorType {
    &self.error_type
  }
}


impl fmt::Display for Error {
  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    self.error.fmt(f)
  }
}


impl StdError for Error {
  fn description(&self) -> &str {
    self.error.description()
  }
}