34 lines
802 B
Rust
34 lines
802 B
Rust
#![cfg_attr(not(feature = "std"), no_std)]
|
|
|
|
#[cfg(not(feature = "std"))]
|
|
use core::str;
|
|
|
|
#[cfg(feature = "std")]
|
|
use std::str;
|
|
|
|
use combine::{
|
|
error::UnexpectedParse,
|
|
parser::{
|
|
byte::digit,
|
|
choice::optional,
|
|
range::recognize,
|
|
repeat::{skip_many, skip_many1},
|
|
token::token,
|
|
},
|
|
Parser,
|
|
};
|
|
|
|
fn main() {
|
|
let mut parser = recognize((
|
|
skip_many1(digit()),
|
|
optional((token(b'.'), skip_many(digit()))),
|
|
))
|
|
.and_then(|bs: &[u8]| {
|
|
// `bs` only contains digits which are ascii and thus UTF-8
|
|
let s = unsafe { str::from_utf8_unchecked(bs) };
|
|
s.parse::<f64>().map_err(|_| UnexpectedParse::Unexpected)
|
|
});
|
|
let result = parser.parse(&b"123.45"[..]);
|
|
assert_eq!(result, Ok((123.45, &b""[..])));
|
|
}
|