1
#![allow(clippy::legacy_numeric_constants)]
2

            
3
use std::collections::BTreeMap;
4
use tree_sitter::Node;
5

            
6
use super::domain::parse_domain;
7
use super::util::named_children;
8
use crate::errors::{FatalParseError, RecoverableParseError};
9
use conjure_cp_core::ast::{DomainPtr, Name, SymbolTablePtr};
10

            
11
/// Parse a find statement into a map of decision variable names to their domains.
12
441
pub fn parse_find_statement(
13
441
    find_statement: Node,
14
441
    source_code: &str,
15
441
    symbols: Option<SymbolTablePtr>,
16
855
    errors: &mut Vec<RecoverableParseError>,
17
855
) -> Result<BTreeMap<Name, DomainPtr>, FatalParseError> {
18
855
    let mut vars = BTreeMap::new();
19
414

            
20
855
    let domain = find_statement
21
441
        .child_by_field_name("domain")
22
855
        .expect("No domain found in find statement");
23
855
    let domain = parse_domain(domain, source_code, symbols, errors)?;
24

            
25
441
    let variable_list = find_statement
26
441
        .child_by_field_name("variables")
27
855
        .expect("No variable list found");
28
969
    for variable in named_children(&variable_list) {
29
969
        let variable_name = &source_code[variable.start_byte()..variable.end_byte()];
30
969
        vars.insert(Name::user(variable_name), domain.clone());
31
969
    }
32
471

            
33
912
    Ok(vars)
34
912
}