elo-rust 0.3.0

Rust code generation target for ELO validation language
Documentation

ELO Rust Code Generation Target

A production-grade Rust code generation target for the ELO validation language. Converts ELO validation expressions into zero-cost Rust validators with <1ยตs execution time.

CI Crates.io Docs.rs License Security Audit Code Coverage

Features

โœจ High Performance

  • Generated validators execute in <1ยตs
  • Zero-copy design with minimal allocations
  • Compile-time optimization via Rust compiler

๐ŸŽฏ Comprehensive Validation

  • String operations: regex matching, contains, length, case conversion, trim, starts_with, ends_with
  • Date/time functions: today(), now(), age(), days_since(), date parsing
  • Array operations: contains, any, all, length, is_empty
  • Type checking: is_null, is_some for Option types

๐Ÿ› ๏ธ Developer Friendly

  • Simple validator macro: #[elo_validator(elo = "expression")]
  • CLI tool for code generation: elo compile --expression "age >= 18"
  • Framework integration examples (Actix-web, Axum)
  • Comprehensive error reporting

Quick Start

As a Library

use elo_rust::RustCodeGenerator;

let gen = RustCodeGenerator::new();
let code = gen.generate_function_signature("validate_user", "User")?;

Using the CLI

# Generate validator from command line
elo compile --expression "age >= 18"

# Read from file, write to file
elo compile --input rules.elo --output validator.rs

# Validate ELO expression syntax
elo validate --input rules.elo

In Actix-web

use actix_web::{post, web, App, HttpServer};
use elo_rust::ValidationErrors;

#[derive(Deserialize)]
struct CreateUserRequest {
    username: String,
    email: String,
    age: i32,
}

struct UserValidator;

impl UserValidator {
    pub fn validate(input: &CreateUserRequest) -> Result<(), ValidationErrors> {
        let mut errors = ValidationErrors::new();

        if input.age < 18 {
            errors.add_error("age", "Must be at least 18");
        }

        if errors.is_empty() {
            Ok(())
        } else {
            Err(errors)
        }
    }
}

#[post("/users")]
async fn create_user(req: web::Json<CreateUserRequest>) -> HttpResponse {
    match UserValidator::validate(&req) {
        Ok(()) => HttpResponse::Created().json("User created"),
        Err(errors) => HttpResponse::BadRequest().json(errors),
    }
}

Supported Functions

String Functions (8 total)

  • matches(pattern) - Regex pattern matching
  • contains(substring) - Substring search
  • length() - String length
  • uppercase() - Convert to uppercase
  • lowercase() - Convert to lowercase
  • trim() - Remove whitespace
  • starts_with(prefix) - Prefix check
  • ends_with(suffix) - Suffix check

DateTime Functions (5 total)

  • today() - Current date
  • now() - Current UTC timestamp
  • age(birthdate) - Age calculation from birthdate
  • days_since(date) - Days elapsed
  • date("YYYY-MM-DD") - Parse ISO 8601 date

Array Functions (5 total)

  • contains(value) - Element search
  • any(predicate) - Existence check with closure
  • all(predicate) - Universal check with closure
  • length() - Array size
  • is_empty() - Empty check

Type Functions (2 total)

  • is_null() - Option null check
  • is_some() - Option some check

Examples

Age Validation

age >= 18

Email Validation

email matches "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"

Complex User Validation

email matches pattern &&
username.length() >= 3 && username.length() <= 20 &&
age >= 18 &&
age <= 120 &&
verified == true &&
!banned

Permission Checking

(roles.contains("admin") || roles.contains("moderator")) &&
verified == true &&
!banned

Order Validation

items.length() > 0 &&
items.all(quantity > 0 && price > 0) &&
total > 0 &&
days_since(created_at) < 30

API Documentation

RustCodeGenerator

Main code generator for transforming ELO expressions to Rust code.

pub struct RustCodeGenerator {
    // Type context for resolving custom types
}

impl RustCodeGenerator {
    pub fn new() -> Self
    pub fn with_context(type_context: TypeContext) -> Self
    pub fn generate_function_signature(
        &self,
        name: &str,
        input_type: &str,
    ) -> Result<TokenStream, String>

    pub fn generate_literal_integer(&self, value: i64) -> Result<TokenStream, String>
    pub fn generate_literal_string(&self, value: &str) -> Result<TokenStream, String>
    pub fn generate_literal_bool(&self, value: bool) -> Result<TokenStream, String>

    pub fn generate_field_access(
        &self,
        receiver: &str,
        field: &str,
    ) -> Result<TokenStream, String>

    pub fn generate_validator(
        &self,
        name: &str,
        elo_expr: &str,
        input_type: &str,
    ) -> Result<TokenStream, String>
}

OperatorGenerator

Generates code for binary and unary operations.

pub struct OperatorGenerator;

impl OperatorGenerator {
    pub fn new() -> Self
    pub fn binary(
        &self,
        op: BinaryOp,
        left: TokenStream,
        right: TokenStream,
    ) -> TokenStream
    pub fn unary(
        &self,
        op: UnaryOp,
        operand: TokenStream,
    ) -> TokenStream
}

FunctionGenerator

Generates code for standard library functions.

pub struct FunctionGenerator;

impl FunctionGenerator {
    pub fn new() -> Self
    pub fn string_function(
        &self,
        name: &str,
        args: Vec<TokenStream>,
    ) -> TokenStream
    pub fn datetime_function(
        &self,
        name: &str,
        args: Vec<TokenStream>,
    ) -> TokenStream
    pub fn array_function(
        &self,
        name: &str,
        args: Vec<TokenStream>,
    ) -> TokenStream
}

Project Statistics

  • Total Tests: 573 (100% passing) - +150 tests for security coverage
  • Code Coverage: 65%+ of codebase
  • Security Tests: 37 dedicated security tests
  • Standard Library Functions: 20+ implemented
  • Framework Examples: Actix-web, Axum
  • Code Generation: Full AST visitor pattern
  • Performance: <1ยตs validator execution
  • Security: Enterprise-grade hardening (7 vulnerabilities identified & fixed)

Testing

Run the full test suite:

cargo test

Run specific test category:

cargo test string_functions
cargo test datetime_functions
cargo test array_functions
cargo test macro_usage

Run examples:

cargo run --example actix_validator --features serde-support
cargo run --example axum_validator --features serde-support

Building

# Debug build
cargo build

# Release build with optimizations
cargo build --release

# CLI tool
cargo build --bin elo

# Documentation
cargo doc --no-deps --open

Architecture

src/
โ”œโ”€โ”€ lib.rs                 # Public API
โ”œโ”€โ”€ codegen/
โ”‚   โ”œโ”€โ”€ mod.rs            # Main RustCodeGenerator
โ”‚   โ”œโ”€โ”€ operators.rs      # Binary/unary operators
โ”‚   โ”œโ”€โ”€ functions.rs      # String/date/array functions
โ”‚   โ”œโ”€โ”€ types.rs          # Type system
โ”‚   โ””โ”€โ”€ errors.rs         # Error handling
โ”œโ”€โ”€ runtime/
โ”‚   โ””โ”€โ”€ mod.rs            # ValidationError types
โ””โ”€โ”€ bin/
    โ””โ”€โ”€ elo.rs            # CLI tool

tests/
โ”œโ”€โ”€ string_functions.rs   # 34 tests
โ”œโ”€โ”€ datetime_functions.rs # 39 tests
โ”œโ”€โ”€ array_functions.rs    # 37 tests
โ”œโ”€โ”€ macro_usage.rs        # 38 tests
โ””โ”€โ”€ ...

examples/
โ”œโ”€โ”€ simple_validator.rs   # Basic example
โ”œโ”€โ”€ actix_validator.rs    # Actix integration
โ””โ”€โ”€ axum_validator.rs     # Axum integration

Performance

Generated validators are designed for minimal overhead:

  • Code Generation: <100ms per expression
  • Validator Execution: <1ยตs per check
  • Memory Overhead: Minimal allocations
  • Binary Size: ~50 lines typical validator code

License

MIT

Contributing

Contributions are welcome! Please ensure:

  • All tests pass: cargo test
  • Code passes clippy: cargo clippy --all-targets -- -D warnings
  • Code is formatted: cargo fmt

Support

For issues, questions, or contributions, please visit: https://github.com/enspirit/elo


Version: 0.1.1 Status: โœ… Production Ready Last Updated: February 8, 2026 Security: โœ… Fully Audited (7 vulnerabilities fixed) Tests: โœ… 573 passing (100%) Coverage: โœ… 65%+