util/error: add error handling
This commit is contained in:
parent
5468ea5051
commit
eef3e9c556
@ -5,3 +5,4 @@ extern crate ffmpeg_sys as ffi;
|
|||||||
#[macro_use] extern crate bitflags;
|
#[macro_use] extern crate bitflags;
|
||||||
|
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
pub use util::error::Error;
|
||||||
|
50
src/util/error.rs
Normal file
50
src/util/error.rs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
use ffi::*;
|
||||||
|
use std::error;
|
||||||
|
use std::fmt;
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use libc::c_int;
|
||||||
|
use std::ffi::CStr;
|
||||||
|
use std::str::from_utf8_unchecked;
|
||||||
|
|
||||||
|
pub struct Error {
|
||||||
|
code: c_int,
|
||||||
|
desc: RefCell<Option<[i8; AV_ERROR_MAX_STRING_SIZE as usize]>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Error {
|
||||||
|
pub fn new(code: c_int) -> Self {
|
||||||
|
Error { code: code, desc: RefCell::new(None) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Error {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
||||||
|
f.write_str(error::Error::description(self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for Error {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
||||||
|
try!(f.write_str("ffmpeg::Error("));
|
||||||
|
try!(f.write_str(&format!("{}: ", AVUNERROR(self.code))));
|
||||||
|
try!(fmt::Display::fmt(self, f));
|
||||||
|
f.write_str(")")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl error::Error for Error {
|
||||||
|
fn description(&self) -> &str {
|
||||||
|
unsafe {
|
||||||
|
let mut desc = self.desc.borrow_mut();
|
||||||
|
|
||||||
|
if let None = *desc {
|
||||||
|
let mut buf = [0i8; AV_ERROR_MAX_STRING_SIZE as usize];
|
||||||
|
av_strerror(self.code, buf.as_mut_ptr(), AV_ERROR_MAX_STRING_SIZE);
|
||||||
|
|
||||||
|
*desc = Some(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
from_utf8_unchecked(CStr::from_ptr(desc.unwrap().as_ptr()).to_bytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
pub mod error;
|
||||||
|
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use std::str::from_utf8_unchecked;
|
use std::str::from_utf8_unchecked;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user