use nom::branch::alt;
use nom::combinator::map;
use nom::Parser;
use crate::parsers::parse_number;
use crate::parsers::{parse_f_exp, ParseResult, Span};
use crate::types::DurationValue;
pub fn parse_d_value<'a, T: Into<Span<'a>>>(input: T) -> ParseResult<'a, DurationValue> {
let number = map(parse_number, DurationValue::new_number);
let f_exp = map(parse_f_exp, DurationValue::new_f_exp);
alt((number, f_exp)).parse(input.into())
}
impl crate::parsers::Parser for DurationValue {
type Item = DurationValue;
fn parse<'a, S: Into<Span<'a>>>(input: S) -> ParseResult<'a, Self::Item> {
parse_d_value(input)
}
}
#[cfg(test)]
mod tests {
use crate::parsers::UnwrapValue;
use crate::{DurationValue, FluentExpression, FunctionHead, Parser};
#[test]
fn test_parse() {
assert!(DurationValue::parse("1.23").is_value(DurationValue::number(1.23)));
assert!(
DurationValue::parse("fun-sym").is_value(DurationValue::fluent_expression(
FluentExpression::function(FunctionHead::Simple("fun-sym".into()))
))
);
}
}