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
//! Possible errors generated by this backend.
pub use glfw::InitError;
pub use luminance::state::StateQueryError;

use std::error::Error;
use std::fmt;

/// Error that can be risen while creating a surface.
#[derive(Debug)]
pub enum GlfwSurfaceError {
  /// Initialization of the surface went wrong.
  ///
  /// This variant exposes a **glfw** error for further information about what went wrong.
  InitError(InitError),
  /// Window creation failed.
  WindowCreationFailed,
  /// No primary monitor detected.
  NoPrimaryMonitor,
  /// No available video mode.
  NoVideoMode,
  /// The graphics state is not available.
  ///
  /// This error is generated when the initialization code is called on a thread on which the
  /// graphics state has already been acquired.
  GraphicsStateError(StateQueryError),
}

// TODO: better implementation
impl fmt::Display for GlfwSurfaceError {
  fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
    f.write_str(self.description())
  }
}

impl Error for GlfwSurfaceError {
  fn description(&self) -> &str {
    match *self {
      GlfwSurfaceError::InitError(_) => "initialization error",
      GlfwSurfaceError::WindowCreationFailed => "failed to create window",
      GlfwSurfaceError::NoPrimaryMonitor => "no primary monitor",
      GlfwSurfaceError::NoVideoMode => "no video mode",
      GlfwSurfaceError::GraphicsStateError(_) => "failed to get graphics state",
    }
  }

  fn cause(&self) -> Option<&Error> {
    match *self {
      GlfwSurfaceError::InitError(ref e) => Some(e),
      GlfwSurfaceError::GraphicsStateError(ref e) => Some(e),
      _ => None
    }
  }
}