optional combinator
This commit is contained in:
parent
8b010811e3
commit
a02accf08a
@ -1,5 +1,16 @@
|
|||||||
use crate::parser::Parser;
|
use crate::parser::Parser;
|
||||||
|
|
||||||
|
pub fn optional<P, I, O, E>(parser: P) -> impl Parser<I, Option<O>, E>
|
||||||
|
where
|
||||||
|
P: Parser<I, O, E>,
|
||||||
|
I: Clone,
|
||||||
|
{
|
||||||
|
move |input: I| match parser.parse(input.clone()) {
|
||||||
|
Ok((output, rest)) => Ok((Some(output), rest)),
|
||||||
|
Err(_e) => Ok((None, input)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn map<P, F, I, O1, O2, E>(parser: P, map_fn: F) -> impl Parser<I, O2, E>
|
pub fn map<P, F, I, O1, O2, E>(parser: P, map_fn: F) -> impl Parser<I, O2, E>
|
||||||
where
|
where
|
||||||
P: Parser<I, O1, E>,
|
P: Parser<I, O1, E>,
|
||||||
|
@ -12,7 +12,7 @@ pub use parser::{ParseResult, Parser};
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::choice::choice;
|
use crate::choice::choice;
|
||||||
use crate::primitives::{any_char, literal, literal_char, pred};
|
use crate::primitives::{any_char, literal, literal_char, one_of, pred};
|
||||||
use crate::sequence::seq;
|
use crate::sequence::seq;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
@ -48,6 +48,8 @@ mod tests {
|
|||||||
literal("false").to(JsonValue::Bool(false)),
|
literal("false").to(JsonValue::Bool(false)),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
let digit = one_of("1234567890");
|
||||||
|
|
||||||
let json_string = seq((
|
let json_string = seq((
|
||||||
literal_char('"'),
|
literal_char('"'),
|
||||||
pred(any_char, |ch| *ch != '"'),
|
pred(any_char, |ch| *ch != '"'),
|
||||||
|
@ -43,6 +43,16 @@ pub trait Parser<I, O, E> {
|
|||||||
{
|
{
|
||||||
BoxedParser::new(crate::sequence::tuple2(self, next_parser))
|
BoxedParser::new(crate::sequence::tuple2(self, next_parser))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn optional<'a>(self) -> BoxedParser<'a, I, Option<O>, E>
|
||||||
|
where
|
||||||
|
I: Clone + 'a,
|
||||||
|
O: 'a,
|
||||||
|
E: 'a,
|
||||||
|
Self: Sized + 'a,
|
||||||
|
{
|
||||||
|
BoxedParser::new(crate::combinators::optional(self))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BoxedParser<'a, I, O, E> {
|
pub struct BoxedParser<'a, I, O, E> {
|
||||||
|
Loading…
Reference in New Issue
Block a user