hexput-ast-api 0.1.6

Core AST parsing and processing library
Documentation
pub mod ast_structs;
pub mod lexer;
pub mod parser;
pub mod optimizer;
pub mod feature_flags;
pub mod parallel;

use serde_json::{to_string_pretty, to_string, Value};
use feature_flags::FeatureFlags;
use parser::ParseError;

pub fn process_code(code: &str, feature_flags: FeatureFlags) -> Result<ast_structs::Program, ParseError> {
    let runtime = parallel::create_runtime();
    
    let tokens = lexer::tokenize(code);
    
    let mut parser = parser::Parser::new(&tokens, feature_flags, code);
    let ast = parser.parse_program()?;
    
    let optimized_ast = optimizer::optimize_ast(ast, &runtime);
    
    Ok(optimized_ast)
}

pub fn filter_locations(value: Value) -> Value {
    match value {
        Value::Object(mut map) => {
            map.remove("location");
            
            let filtered_map = map.into_iter()
                .map(|(k, v)| (k, filter_locations(v)))
                .collect();
            
            Value::Object(filtered_map)
        },
        Value::Array(arr) => {
            Value::Array(arr.into_iter().map(filter_locations).collect())
        },
        _ => value,
    }
}

pub fn to_json_string(value: &impl serde::Serialize, include_source_mapping: bool) -> Result<String, serde_json::Error> {
    if include_source_mapping {
        to_string(value)
    } else {
        let json_value = serde_json::to_value(value)?;
        let filtered = filter_locations(json_value);
        to_string(&filtered)
    }
}

pub fn to_json_string_pretty(value: &impl serde::Serialize, include_source_mapping: bool) -> Result<String, serde_json::Error> {
    if include_source_mapping {
        to_string_pretty(value)
    } else {
        let json_value = serde_json::to_value(value)?;
        let filtered = filter_locations(json_value);
        to_string_pretty(&filtered)
    }
}

pub fn format_error_as_json(error: &ParseError, minify: bool) -> String {
    let error_json = serde_json::json!({
        "error": {
            "type": "ParseError",
            "message": format!("{}", error)
        }
    });
    
    if minify {
        to_string(&error_json).unwrap_or_else(|_| String::from(r#"{"error":{"type":"ParseError","message":"JSON serialization error"}}"#))
    } else {
        to_string_pretty(&error_json).unwrap_or_else(|_| String::from(r#"{"error":{"type":"ParseError","message":"JSON serialization error"}}"#))
    }
}