conjure_cp_essence_parser/parser/
find.rs

1#![allow(clippy::legacy_numeric_constants)]
2
3use std::cell::RefCell;
4use std::collections::BTreeMap;
5use std::rc::Rc;
6use tree_sitter::Node;
7
8use super::domain::parse_domain;
9use super::util::named_children;
10use crate::EssenceParseError;
11use conjure_cp_core::ast::{DomainPtr, Name, SymbolTable};
12
13/// Parse a find statement into a map of decision variable names to their domains.
14pub fn parse_find_statement(
15    find_statement: Node,
16    source_code: &str,
17    symbols: Option<Rc<RefCell<SymbolTable>>>,
18) -> Result<BTreeMap<Name, DomainPtr>, EssenceParseError> {
19    let mut vars = BTreeMap::new();
20
21    let domain = find_statement
22        .child_by_field_name("domain")
23        .expect("No domain found in find statement");
24    let domain = parse_domain(domain, source_code, symbols)?;
25
26    let variable_list = find_statement
27        .child_by_field_name("variables")
28        .expect("No variable list found");
29    for variable in named_children(&variable_list) {
30        let variable_name = &source_code[variable.start_byte()..variable.end_byte()];
31        vars.insert(Name::user(variable_name), domain.clone());
32    }
33
34    Ok(vars)
35}