diff --git a/src/number/complete.rs b/src/number/complete.rs index d8a2a978..43809a5b 100644 --- a/src/number/complete.rs +++ b/src/number/complete.rs @@ -1407,7 +1407,7 @@ use crate::traits::ParseTo; /// ``` pub fn float>(input: T) -> IResult where - T: Clone + Offset + ParseTo + Compare<&'static str>, + T: Clone + Offset + ParseTo + Compare<&'static str>, T: Input, ::Item: AsChar, ::Iter: Clone, @@ -1457,7 +1457,7 @@ where /// ``` pub fn double>(input: T) -> IResult where - T: Clone + Offset + ParseTo + Compare<&'static str>, + T: Clone + Offset + ParseTo + Compare<&'static str>, T: Input, ::Item: AsChar, ::Iter: Clone, diff --git a/src/number/mod.rs b/src/number/mod.rs index 9e7e3d7e..9982b465 100644 --- a/src/number/mod.rs +++ b/src/number/mod.rs @@ -3,6 +3,7 @@ use core::{ marker::PhantomData, ops::{Add, Shl}, + str::FromStr, }; use crate::{ @@ -1350,7 +1351,7 @@ where pub fn float>() -> impl Parser where T: Clone + Offset, - T: Input + crate::traits::ParseTo + Compare<&'static str>, + T: Input + crate::traits::ParseTo + Compare<&'static str>, ::Item: AsChar + Clone, T: AsBytes, T: for<'a> Compare<&'a [u8]>, @@ -1365,7 +1366,7 @@ where pub fn double>() -> impl Parser where T: Clone + Offset, - T: Input + crate::traits::ParseTo + Compare<&'static str>, + T: Input + crate::traits::ParseTo + Compare<&'static str>, ::Item: AsChar + Clone, T: AsBytes, T: for<'a> Compare<&'a [u8]>, @@ -1385,10 +1386,11 @@ struct Float { impl> Parser for Float where I: Clone + Offset, - I: Input + crate::traits::ParseTo + Compare<&'static str>, + I: Input + crate::traits::ParseTo + Compare<&'static str>, ::Item: AsChar + Clone, I: AsBytes, I: for<'a> Compare<&'a [u8]>, + O: FromStr, { type Output = O; type Error = E; diff --git a/src/number/streaming.rs b/src/number/streaming.rs index cd892d65..23bdb1a5 100644 --- a/src/number/streaming.rs +++ b/src/number/streaming.rs @@ -8,7 +8,7 @@ use crate::error::{ErrorKind, ParseError}; use crate::lib::std::ops::{Add, Shl}; use crate::sequence::pair; use crate::traits::{AsBytes, AsChar, Compare, Offset}; -use crate::{internal::*, Input}; +use crate::{internal::*, Input, ParseTo}; /// Recognizes an unsigned 1 byte integer. /// @@ -1377,7 +1377,7 @@ where pub fn float>(input: T) -> IResult where T: Clone + Offset, - T: Input + crate::traits::ParseTo + Compare<&'static str>, + T: Input + ParseTo + Compare<&'static str>, ::Item: AsChar + Clone, T: AsBytes, T: for<'a> Compare<&'a [u8]>, @@ -1427,7 +1427,7 @@ where pub fn double>(input: T) -> IResult where T: Clone + Offset, - T: Input + crate::traits::ParseTo + Compare<&'static str>, + T: Input + ParseTo + Compare<&'static str>, ::Item: AsChar + Clone, T: AsBytes, T: for<'a> Compare<&'a [u8]>, diff --git a/src/traits.rs b/src/traits.rs index f778c360..b6781bdd 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -1078,20 +1078,20 @@ impl<'a, 'b> FindSubstring<&'b str> for &'a str { } /// Used to integrate `str`'s `parse()` method -pub trait ParseTo { +pub trait ParseTo { /// Succeeds if `parse()` succeeded. The byte slice implementation /// will first convert it to a `&str`, then apply the `parse()` function - fn parse_to(&self) -> Option; + fn parse_to(&self) -> Option; } -impl<'a, R: FromStr> ParseTo for &'a [u8] { - fn parse_to(&self) -> Option { +impl<'a> ParseTo for &'a [u8] { + fn parse_to(&self) -> Option { from_utf8(self).ok().and_then(|s| s.parse().ok()) } } -impl<'a, R: FromStr> ParseTo for &'a str { - fn parse_to(&self) -> Option { +impl<'a> ParseTo for &'a str { + fn parse_to(&self) -> Option { self.parse().ok() } }