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}