Skip to main content

conjure_cp_essence_parser/
parser_legacy.rs

1use crate::errors::{FatalParseError, ParseErrorCollection};
2use conjure_cp_core::ast::assertions::debug_assert_model_well_formed;
3use conjure_cp_core::parse::model_from_json;
4use conjure_cp_core::{Model, context::Context};
5use std::sync::{Arc, RwLock};
6
7pub fn parse_essence_file(
8    path: &str,
9    context: Arc<RwLock<Context<'static>>>,
10) -> Result<Model, Box<ParseErrorCollection>> {
11    let mut cmd = std::process::Command::new("conjure");
12    let output = match cmd
13        .arg("pretty")
14        .arg("--output-format=astjson")
15        .arg(path)
16        .output()
17    {
18        Ok(output) => output,
19        Err(e) => {
20            return Err(Box::new(ParseErrorCollection::fatal(
21                FatalParseError::ConjurePrettyError(e.to_string()),
22            )));
23        }
24    };
25
26    if !output.status.success() {
27        let stderr_string = String::from_utf8(output.stderr)
28            .unwrap_or("stderr is not a valid UTF-8 string".to_string());
29        return Err(Box::new(ParseErrorCollection::fatal(
30            FatalParseError::ConjurePrettyError(stderr_string),
31        )));
32    }
33
34    let astjson = match String::from_utf8(output.stdout) {
35        Ok(astjson) => astjson,
36        Err(e) => {
37            return Err(Box::new(ParseErrorCollection::fatal(
38                FatalParseError::ConjurePrettyError(format!(
39                    "Error parsing output from conjure: {e:#?}"
40                )),
41            )));
42        }
43    };
44
45    let parsed_model = model_from_json(&astjson, context)
46        .map_err(|e| Box::new(ParseErrorCollection::fatal(e.into())))?;
47    debug_assert_model_well_formed(&parsed_model, "via-conjure");
48    Ok(parsed_model)
49}