hexput_ast_api/
lib.rs

1pub mod ast_structs;
2pub mod lexer;
3pub mod parser;
4pub mod optimizer;
5pub mod feature_flags;
6pub mod parallel;
7
8use serde_json::{to_string_pretty, to_string, Value};
9use feature_flags::FeatureFlags;
10use parser::ParseError;
11
12pub fn process_code(code: &str, feature_flags: FeatureFlags) -> Result<ast_structs::Program, ParseError> {
13    let runtime = parallel::create_runtime();
14    
15    let tokens = lexer::tokenize(code);
16    
17    let mut parser = parser::Parser::new(&tokens, feature_flags, code);
18    let ast = parser.parse_program()?;
19    
20    let optimized_ast = optimizer::optimize_ast(ast, &runtime);
21    
22    Ok(optimized_ast)
23}
24
25pub fn filter_locations(value: Value) -> Value {
26    match value {
27        Value::Object(mut map) => {
28            map.remove("location");
29            
30            let filtered_map = map.into_iter()
31                .map(|(k, v)| (k, filter_locations(v)))
32                .collect();
33            
34            Value::Object(filtered_map)
35        },
36        Value::Array(arr) => {
37            Value::Array(arr.into_iter().map(filter_locations).collect())
38        },
39        _ => value,
40    }
41}
42
43pub fn to_json_string(value: &impl serde::Serialize, include_source_mapping: bool) -> Result<String, serde_json::Error> {
44    if include_source_mapping {
45        to_string(value)
46    } else {
47        let json_value = serde_json::to_value(value)?;
48        let filtered = filter_locations(json_value);
49        to_string(&filtered)
50    }
51}
52
53pub fn to_json_string_pretty(value: &impl serde::Serialize, include_source_mapping: bool) -> Result<String, serde_json::Error> {
54    if include_source_mapping {
55        to_string_pretty(value)
56    } else {
57        let json_value = serde_json::to_value(value)?;
58        let filtered = filter_locations(json_value);
59        to_string_pretty(&filtered)
60    }
61}
62
63pub fn format_error_as_json(error: &ParseError, minify: bool) -> String {
64    let error_json = serde_json::json!({
65        "error": {
66            "type": "ParseError",
67            "message": format!("{}", error)
68        }
69    });
70    
71    if minify {
72        to_string(&error_json).unwrap_or_else(|_| String::from(r#"{"error":{"type":"ParseError","message":"JSON serialization error"}}"#))
73    } else {
74        to_string_pretty(&error_json).unwrap_or_else(|_| String::from(r#"{"error":{"type":"ParseError","message":"JSON serialization error"}}"#))
75    }
76}