70 lines
1.1 KiB
Rust
70 lines
1.1 KiB
Rust
use nom::
|
|
{
|
|
IResult,
|
|
branch::alt,
|
|
bytes::complete::tag,
|
|
combinator::map,
|
|
sequence::terminated,
|
|
};
|
|
|
|
use super::word_boundary;
|
|
|
|
fn true_(i: &str) -> IResult<&str, bool>
|
|
{
|
|
map
|
|
(
|
|
terminated
|
|
(
|
|
tag("true"),
|
|
word_boundary,
|
|
),
|
|
|_| true,
|
|
)(i)
|
|
}
|
|
|
|
fn false_(i: &str) -> IResult<&str, bool>
|
|
{
|
|
map
|
|
(
|
|
terminated
|
|
(
|
|
tag("false"),
|
|
word_boundary,
|
|
),
|
|
|_| false,
|
|
)(i)
|
|
}
|
|
|
|
pub fn boolean(i: &str) -> IResult<&str, bool>
|
|
{
|
|
alt
|
|
((
|
|
true_,
|
|
false_,
|
|
))(i)
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests
|
|
{
|
|
use crate::parse::*;
|
|
|
|
#[test]
|
|
fn parse_boolean()
|
|
{
|
|
assert_eq!(boolean("true"), Ok(("", true)));
|
|
assert_eq!(boolean("false"), Ok(("", false)));
|
|
assert_eq!(boolean("true false"), Ok((" false", true)));
|
|
assert_eq!(boolean("false true"), Ok((" true", false)));
|
|
assert_eq!(boolean("true,"), Ok((",", true)));
|
|
assert_eq!(boolean("false,"), Ok((",", false)));
|
|
assert!(boolean("truefalse").is_err());
|
|
assert!(boolean("falsetrue").is_err());
|
|
assert!(boolean("truea").is_err());
|
|
assert!(boolean("falsea").is_err());
|
|
assert!(boolean("a").is_err());
|
|
assert!(boolean("-").is_err());
|
|
assert!(boolean(" ").is_err());
|
|
}
|
|
}
|