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::EssenceParseError;
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
313
pub fn parse_find_statement(
13
313
    find_statement: Node,
14
313
    source_code: &str,
15
313
    symbols: Option<SymbolTablePtr>,
16
313
) -> Result<BTreeMap<Name, DomainPtr>, EssenceParseError> {
17
313
    let mut vars = BTreeMap::new();
18

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

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

            
32
313
    Ok(vars)
33
313
}