message: complex: refactor ParseComplexError a little
diff: @@ -811,27 +811,23 @@ impl<T> FromStr for Complex<T> where
  } else if b.ends_with(imag) {
  re = a; im = b;
  } else {
  - return Err(ParseComplexError { kind: ComplexErrorKind::ExprError });
  + return Err(ParseComplexError::new());
  }
  // parse re
  - let re = try!(T::from_str(re)
  - .map_err(|e| ParseComplexError { kind: ComplexErrorKind::ParseError(e) }));
  + let re = try!(T::from_str(re).map_err(ParseComplexError::from_error));
  // pop imaginary unit off
  let mut im = &im[..im.len()-1];
  // handle im == "i" or im == "-i"
  - if im.is_empty() {
  + if im.is_empty() || im == "+" {
  im = "1";
  } else if im == "-" {
  im = "-1";
  - } else if im == "+" {
  - im = "1";
  }
  // parse im
  - let im = try!(T::from_str(im)
  - .map_err(|e| ParseComplexError { kind: ComplexErrorKind::ParseError(e) }));
  + let im = try!(T::from_str(im).map_err(ParseComplexError::from_error));
  Ok(Complex::new(re, im))
  }
  @@ -873,33 +869,38 @@ enum ComplexErrorKind<E>
  ExprError
  }
  -impl<E> Error for ParseComplexError<E> where
  - E: Error
  +impl<E> ParseComplexError<E>
  {
  - fn description(&self) -> &str {
  - self.kind.description()
  + fn new() -> Self {
  + ParseComplexError {
  + kind: ComplexErrorKind::ExprError,
  }
  }
  -impl<E> fmt::Display for ParseComplexError<E> where
  - E: Error
  -{
  - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  - self.description().fmt(f)
  + fn from_error(error: E) -> Self {
  + ParseComplexError {
  + kind: ComplexErrorKind::ParseError(error),
  + }
  }
  }
  -impl<E> ComplexErrorKind<E> where
  - E: Error
  +impl<E: Error> Error for ParseComplexError<E>
  {
  fn description(&self) -> &str {
  - match *self {
  + match self.kind {
  ComplexErrorKind::ParseError(ref e) => e.description(),
  ComplexErrorKind::ExprError => "invalid or unsupported complex expression"
  }
  }
  }
  +impl<E: Error> fmt::Display for ParseComplexError<E>
  +{
  + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  + self.description().fmt(f)
  + }
  +}
  +
  #[cfg(test)]
  fn hash<T: hash::Hash>(x: &T) -> u64 {
  use std::hash::{BuildHasher, Hasher};
  