online-dsl-forge 0.3.3

A bounded parser and runtime for in-memory DSL expressions.
Documentation
use crate::sema::{CapabilityKind, CapabilityMeta, VerifiedProgram};

use super::{DynamicRegistry, EvalError};

pub(super) fn verify_runtime_capabilities(
  program: &VerifiedProgram,
  registry: &DynamicRegistry,
) -> Result<(), EvalError> {
  for (ticket, expected) in program.required_capability_metadata() {
    let Some(actual) = registry.capability_for_ticket(ticket) else {
      return Err(EvalError::new(
        format!(
          "runtime registry is missing verified {} {} with {} arguments",
          capability_label(ticket.kind),
          ticket.name,
          ticket.arity
        ),
        program.root().span(),
      ));
    };
    if !capability_metadata_matches(expected, &actual) {
      return Err(EvalError::new(
        format!(
          "runtime registry metadata for verified {} {} with {} arguments does not match analyzed metadata",
          capability_label(ticket.kind),
          ticket.name,
          ticket.arity
        ),
        program.root().span(),
      ));
    }
  }
  Ok(())
}

fn capability_metadata_matches(expected: &CapabilityMeta, actual: &CapabilityMeta) -> bool {
  expected == actual
}

fn capability_label(kind: CapabilityKind) -> &'static str {
  match kind {
    CapabilityKind::Function => "function",
    CapabilityKind::Method => "method",
    CapabilityKind::UnaryOp => "unary operator",
    CapabilityKind::BinaryOp => "binary operator",
  }
}