conjure_cp_essence_parser/
parser_legacy.rs1use 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}