flowsurface-indicator-engine 0.9.0

Aggr-level live scripting engine for Flowsurface indicator sources
Documentation
mod ast;
mod compiler;
mod lexer;
mod syntax;

use crate::CompileLimits;
use crate::diagnostics::Diagnostic;
use crate::intrinsic::IntrinsicRegistry;
use std::path::Path;

pub(crate) fn compile_with_registry(
    source: &str,
    path: &Path,
    registry: IntrinsicRegistry,
    limits: CompileLimits,
) -> Result<crate::CompiledIndicator, Vec<Diagnostic>> {
    let lexed = lexer::lex(source, path, limits);
    let mut diagnostics = lexed.diagnostics;
    let parsed = syntax::parse(lexed.tokens, path.to_path_buf());
    diagnostics.extend(parsed.diagnostics);
    if !diagnostics.is_empty() {
        return Err(diagnostics);
    }

    ast::validate_ast_limits(&parsed.ast, path, limits, &mut diagnostics);
    if !diagnostics.is_empty() {
        return Err(diagnostics);
    }

    let compiled = compiler::compile(parsed.ast, path, registry);
    diagnostics.extend(compiled.diagnostics);
    if diagnostics
        .iter()
        .any(|diagnostic| diagnostic.severity == crate::Severity::Error)
    {
        Err(diagnostics)
    } else {
        Ok(crate::CompiledIndicator {
            descriptor: compiled.descriptor,
            requirements: compiled.requirements,
            program: compiled.program,
            registry: compiled.registry,
        })
    }
}