use nom::combinator::map;
use nom::Parser;
use crate::parsers::{parse_name, prefix_expr, typed_list, ParseResult, Span};
use crate::types::Objects;
pub fn parse_problem_objects_declaration<'a, T: Into<Span<'a>>>(
input: T,
) -> ParseResult<'a, Objects> {
map(
prefix_expr(":objects", typed_list(parse_name)),
Objects::new,
)
.parse(input.into())
}
impl crate::parsers::Parser for Objects {
type Item = Objects;
fn parse<'a, S: Into<Span<'a>>>(input: S) -> ParseResult<'a, Self::Item> {
parse_problem_objects_declaration(input)
}
}
#[cfg(test)]
mod test {
use crate::parsers::UnwrapValue;
use crate::{Name, Parser, ToTyped, Type};
use super::*;
#[test]
fn test_parse() {
let input = "(:objects train1 train2)";
assert!(Objects::parse(input).is_value(Objects::new([
Name::new("train1").to_typed(Type::OBJECT),
Name::new("train2").to_typed(Type::OBJECT),
])));
}
}