use crate::ast::{ComprehensionClause, Expr, ListComprehension};
use crate::error::Result;
use crate::parser::Rule;
use pest::iterators::Pair;
use super::super::pair_span;
pub fn parse_list_comprehension(pair: Pair<Rule>) -> Result<Expr> {
let span = pair_span(&pair);
let mut inner = pair.into_inner();
let element = Box::new(super::parse_expression(inner.next().unwrap())?);
let mut clauses = vec![];
for clause_pair in inner {
if clause_pair.as_rule() == Rule::comprehension_clause {
let mut clause_inner = clause_pair.into_inner();
let pattern = crate::parser::parse_pattern(clause_inner.next().unwrap())?;
let iterable = Box::new(super::parse_expression(clause_inner.next().unwrap())?);
let filter = clause_inner
.next()
.map(|expr| super::parse_expression(expr))
.transpose()?
.map(Box::new);
clauses.push(ComprehensionClause {
pattern,
iterable,
filter,
});
}
}
Ok(Expr::ListComprehension(
Box::new(ListComprehension { element, clauses }),
span,
))
}