use nom::branch::alt;
use nom::combinator::map;
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))(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, FExp, FHead, Parser};
#[test]
fn test_parse() {
assert!(DurationValue::parse("1.23").is_value(DurationValue::new_number(1.23)));
assert!(
DurationValue::parse("fun-sym").is_value(DurationValue::new_f_exp(FExp::new_function(
FHead::Simple("fun-sym".into())
)))
);
}
}