rsvr_opengl 0.0.1-alpha.0

Experimental Virtual Reality system in Rust — OpenGL Support
use std::error::Error;

use glium::framebuffer::ValidationError;
use glium::texture::TextureCreationError;
use glium::framebuffer::RenderBufferCreationError;
use glium::SwapBuffersError;
use glium::buffer::BufferCreationError;
use glium::index::BufferCreationError as IndexBufferCreationError;
use glium::vertex::BufferCreationError as VertexBufferCreationError;
use std::fmt::{Display, Formatter, Result as FmtResult};
use glium::DrawError;

use rsvr_webrtc::RsvrWebRtcError;

#[derive(Clone, Debug)]
pub enum RsvrOpenglError {
	OpenglFailure {
		context: &'static str,
		underlying: OpenglUnderlyingFailure,
	},
	ContractFailure {
		context: &'static str,
		message: &'static str,
	},
	WebRtcFailure(RsvrWebRtcError),
}

impl From<RsvrWebRtcError> for RsvrOpenglError {
	fn from(e: RsvrWebRtcError) -> Self {
		RsvrOpenglError::WebRtcFailure(e)
	}
}

#[derive(Clone, Debug)]
pub enum OpenglUnderlyingFailure {
	ValidationError(ValidationError),
	TextureCreationError(TextureCreationError),
	RenderBufferCreationError(RenderBufferCreationError),
	SwapBuffersError(SwapBuffersError),
	VertexBufferCreationError(VertexBufferCreationError),
	IndexBufferCreationError(IndexBufferCreationError),
	DrawError(DrawError),
}

impl Display for RsvrOpenglError {
	fn fmt(&self, f: &mut Formatter) -> FmtResult {
		match self {
			RsvrOpenglError::OpenglFailure { context, underlying } => {
				use self::OpenglUnderlyingFailure::*;
				match underlying {
					ValidationError(e) => {
						write!(f, "{} [{}] caused by {}", self.description(), context, e)
					}
					TextureCreationError(e) => {
						write!(f, "{} [{}] caused by {}", self.description(), context, e)
					}
					RenderBufferCreationError(e) => {
						write!(f, "{} [{}] caused by {}", self.description(), context, e)
					}
					SwapBuffersError(e) => {
						write!(f, "{} [{}] caused by {}", self.description(), context, e)
					}
					VertexBufferCreationError(e) => {
						write!(f, "{} [{}] caused by {}", self.description(), context, e)
					}
					IndexBufferCreationError(e) => {
						write!(f, "{} [{}] caused by {}", self.description(), context, e)
					}
					DrawError(e) => {
						write!(f, "{} [{}] caused by {}", self.description(), context, e)
					}
				}
			}
			RsvrOpenglError::ContractFailure { context, message } => {
				write!(f, "{}; context: {}", message, context)
			}
			RsvrOpenglError::WebRtcFailure(underlying) => {
				write!(f, "WebRTC Failure: {:?}", underlying)
			}
		}
	}
}

impl Error for RsvrOpenglError {}