1use std::num;
2use std::fmt;
3use std::error::{Error};
4use std::str::{from_utf8_unchecked};
5
6use base::{FromAscii};
7
8#[derive(Debug, Clone, PartialEq)]
10pub struct ParseFloatError {
11 kind: FloatErrorKind
12}
13
14#[derive(Debug, Clone, PartialEq)]
15enum FloatErrorKind {
16 FloatErrorKind
17}
18
19impl Error for ParseFloatError {
20 fn description(&self) -> &str {
21 "failed to parse float"
22 }
23}
24
25impl From<num::ParseFloatError> for ParseFloatError {
26 fn from(_: num::ParseFloatError) -> ParseFloatError {
27 ParseFloatError { kind: FloatErrorKind::FloatErrorKind }
28 }
29}
30
31impl fmt::Display for ParseFloatError {
32 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33 self.description().fmt(f)
34 }
35}
36
37impl FromAscii for f32 {
38 type Err = ParseFloatError;
39
40 #[inline]
41 fn from_ascii(src: &[u8]) -> Result<Self, Self::Err> {
42 unsafe {
43 from_utf8_unchecked(src).parse().map_err(From::from)
44 }
45 }
46}
47
48impl FromAscii for f64 {
49 type Err = ParseFloatError;
50
51 #[inline]
52 fn from_ascii(src: &[u8]) -> Result<Self, Self::Err> {
53 unsafe {
54 from_utf8_unchecked(src).parse().map_err(From::from)
55 }
56 }
57}