#![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""[..]))); | |
} |