use crate::{
Character,
TextInput
};
use pups_core::{
Input,
Mode,
ModeResult::{
self,
Failure,
Success,
},
Parser
};
pub struct Whitespace;
impl<'a, C, I> Parser<'a, I> for Whitespace
where
C: Character,
I: Input<'a, Item = C> + TextInput,
{
type Output = I::Slice;
type Error = ();
type Message = ();
fn apply<_Mode: Mode>(
&self,
input: &'a I
) -> ModeResult<I::Slice , (), (), _Mode> {
let start: usize = input.save_cursor();
loop {
let cursor: usize = input.save_cursor();
let Some (character) = input.next() else { break };
if !character.is_whitespace() { input.restore_cursor(cursor); break }
}
let length: usize = input.save_cursor() - start;
if length > 0 {
input.restore_cursor(start);
Success (
_Mode::convert_output(input.consume(length).unwrap()),
_Mode::new_message_container()
)
}
else { Failure (_Mode::convert_error(()), _Mode::new_message_container())}
}
}