diff --git a/src/lib.rs b/src/lib.rs index 148861f..ea20055 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,7 +15,9 @@ use std::slice; use nodrop::NoDrop; // extra traits +use std::any::Any; use std::borrow::{Borrow, BorrowMut}; +use std::error::Error; use std::hash::{Hash, Hasher}; use std::fmt; @@ -36,25 +38,6 @@ unsafe fn new_array() -> A { mem::uninitialized() } -/// Error value indicating insufficient capacity -#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] -pub struct CapacityError { - element: T, -} - -impl CapacityError { - fn new(element: T) -> CapacityError { - CapacityError { - element: element, - } - } - - /// Extract the overflowing element - pub fn element(self) -> T { - self.element - } -} - /// A vector with a fixed capacity. /// /// The `ArrayVec` is a vector backed by a fixed size array. It keeps track of @@ -715,3 +698,42 @@ impl> io::Write for ArrayVec { } fn flush(&mut self) -> io::Result<()> { Ok(()) } } + +/// Error value indicating insufficient capacity +#[derive(Clone, Copy, Eq, Ord, PartialEq, PartialOrd)] +pub struct CapacityError { + element: T, +} + +impl CapacityError { + fn new(element: T) -> CapacityError { + CapacityError { + element: element, + } + } + + /// Extract the overflowing element + pub fn element(self) -> T { + self.element + } +} + +const CAPERROR: &'static str = "insufficient capacity"; + +impl Error for CapacityError { + fn description(&self) -> &str { + CAPERROR + } +} + +impl fmt::Display for CapacityError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", CAPERROR) + } +} + +impl fmt::Debug for CapacityError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}: {}", "CapacityError", CAPERROR) + } +} diff --git a/tests/tests.rs b/tests/tests.rs index a06b6e6..3dd24bd 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -266,6 +266,8 @@ fn test_write() { #[test] fn test_string() { + use std::error::Error; + let text = "hello world"; let mut s = ArrayString::<[_; 16]>::new(); s.push_str(text).unwrap(); @@ -280,4 +282,12 @@ fn test_string() { let mut t = ArrayString::<[_; 2]>::new(); assert!(t.push_str(text).is_err()); assert_eq!(&t, ""); + + // Test Error trait / try + let t = || -> Result<(), Box> { + let mut t = ArrayString::<[_; 2]>::new(); + try!(t.push_str(text)); + Ok(()) + }(); + assert!(t.is_err()); }