manger 0.1.1

A performant, low-level, lightweight and intuitive combinatoric parser library
Documentation
use crate::chars;
use crate::common::{Digit, OneOrMore, Sign};
use crate::error::ConsumeError;
use crate::error::ConsumeErrorType::*;
use crate::{consume_enum, Consumable};
use std::str::FromStr;

enum FloatNumberStruct {
    NoPeriod,
    PeriodStart,
    PeriodMiddle,
}

consume_enum!(
    FloatNumberStruct {
        PeriodStart => [
            : chars::Period,
            : OneOrMore<Digit>;
        ],
        PeriodMiddle => [
            : OneOrMore<Digit>,
            : chars::Period,
            : OneOrMore<Digit>;
        ],
        NoPeriod => [
            : OneOrMore<Digit>;
        ]
    }
);

enum FloatStructure {
    Float,
    Infinity,
    NaN,
}

use crate::chars::alpha;
consume_enum!(
    FloatStructure {
        Float => [
            : Sign,
            : FloatNumberStruct,
            : Option<(alpha::E, OneOrMore<Digit>)>;
        ],
        Infinity => [
            : Sign,
            : alpha::I,
            : alpha::N,
            : alpha::F,
            : alpha::I,
            : alpha::N,
            : alpha::I,
            : alpha::T,
            : alpha::Y;
        ],
        NaN => [
            : alpha::N,
            : alpha::A,
            : alpha::N;
        ]
    }
);

impl Consumable for f32 {
    fn consume_from(source: &str) -> Result<(Self, &str), ConsumeError> {
        let (_, unconsumed) = FloatNumberStruct::consume_from(source)?;

        Ok((
            <f32>::from_str(utf8_slice::till(
                source,
                utf8_slice::len(source) - utf8_slice::len(unconsumed),
            ))
            .map_err(|_| ConsumeError::new_with(InvalidValue { index: 0 }))?,
            unconsumed,
        ))
    }
}