#![cfg_attr(not(feature = "std"), no_std)]
#![allow(unused_unsafe)]
#![warn(unsafe_op_in_unsafe_fn)]
#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::cargo)]
#![deny(
clippy::doc_markdown,
clippy::unnecessary_safety_comment,
clippy::semicolon_if_nothing_returned,
clippy::unwrap_used,
clippy::as_underscore,
clippy::doc_markdown
)]
#![allow(
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_sign_loss,
clippy::cast_lossless,
clippy::cast_precision_loss,
clippy::missing_const_for_fn,
clippy::use_self,
clippy::module_name_repetitions,
clippy::cargo_common_metadata,
clippy::struct_field_names
)]
use core::fmt::{self, Display};
mod binary;
mod common;
mod decimal;
mod float;
mod number;
mod parse;
mod simple;
mod table;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Error;
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "error while parsing a float")
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {
fn description(&self) -> &'static str {
"error while parsing a float"
}
}
pub type Result<T> = core::result::Result<T, Error>;
pub trait FastFloat: float::Float {
#[inline]
fn parse_float<S: AsRef<[u8]>>(s: S) -> Result<Self> {
let s = s.as_ref();
match Self::parse_float_partial(s) {
Ok((v, n)) if n == s.len() => Ok(v),
_ => Err(Error),
}
}
#[inline]
fn parse_float_partial<S: AsRef<[u8]>>(s: S) -> Result<(Self, usize)> {
parse::parse_float(s.as_ref()).ok_or(Error)
}
}
impl FastFloat for f32 {
}
impl FastFloat for f64 {
}
#[inline]
pub fn parse<T: FastFloat, S: AsRef<[u8]>>(s: S) -> Result<T> {
T::parse_float(s)
}
#[inline]
pub fn parse_partial<T: FastFloat, S: AsRef<[u8]>>(s: S) -> Result<(T, usize)> {
T::parse_float_partial(s)
}