Skip to main content

conjure_cp_essence_parser/
parser_legacy.rs

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