manger 0.1.1

A performant, low-level, lightweight and intuitive combinatoric parser library
Documentation
use crate::error::ConsumeError;
use crate::error::ConsumeErrorType::*;
use crate::SelfConsumable;

impl SelfConsumable for &str {
    fn consume_item<'a>(source: &'a str, item: &'_ Self) -> Result<&'a str, ConsumeError> {
        let mut unconsumed = source;

        for (index, token) in item.chars().enumerate() {
            if let Some(next_char) = unconsumed.chars().next() {
                if token != next_char {
                    return Err(ConsumeError::new_with(UnexpectedToken { index, token }));
                }
            } else {
                return Err(ConsumeError::new_with(InsufficientTokens { index }));
            }

            unconsumed = utf8_slice::from(unconsumed, 1);
        }

        Ok(unconsumed)
    }
}

#[cfg(test)]
mod tests {
    use crate::SelfConsumable;

    #[test]
    fn test_strs_self_consume() {
        assert_eq!(<&str>::consume_item("ABCDEF", &"ABC"), Ok("DEF"));
    }
}