complex: refactor ParseComplexError a little
This commit is contained in:
parent
bd22a89a32
commit
ee6bbdb2f6
|
@ -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};
|
||||
|
|
Loading…
Reference in New Issue