7e8917e52761ec099856bd50593aff99612a000b
Establish the Validatrix source code validation framework in Nim, including core detection, tokenization, and validation infrastructure for 10 languages (bash, HTML, JavaScript, Jinja, JSON, Nim, PHP, Python, TOML, YAML). The initial commit introduces the main validatrix.nim entry point with public API (validateSource, validateFile, inspectSource), a comprehensive test suite with per-language test files, build configuration via Makefile and .nimble, detailed LESSONS_LEARNED.md documenting 14 bug classes found during development, and a .gitignore excluding compiled binaries, logs, and build artifacts. The detector module provides extension-to-flavor mapping for 40+ file extensions and content-based language detection, while the debug module supports conditional compilation with -d:validatrixDebug for detailed tokenization logging.
Validatrix
A multi-language source code validation framework written in Nim. Validatrix uses tokenizer-based validation to check syntax correctness across 10 languages and config formats, with auto-detection, comprehensive diagnostics, and a never-crash guarantee.
Features
- 10 languages supported: Nim, Bash, Python, JavaScript, PHP, HTML, Jinja, JSON, YAML, TOML
- Tokenizer-based validation — real tokenizers that track bracket depth, string context, comments, and nesting
- Auto-detection — detect language from file extension or content analysis
- Comprehensive diagnostics — structured error reports with position, severity, hints, and debug output
- Never-crash guarantee — every validation path is wrapped in try/except; invalid input returns errors gracefully, never panics
- JSON output — machine-readable diagnostics via
toJson()on any validation result - Inspection API — extract module structure (imports, definitions, functions/classes) as JSON
- Debug mode — compile with
-d:validatrixDebugfor detailed tokenization logging - No external dependencies — pure Nim standard library
Quick Start
import validatrix
# Validate source code from a string
let r = validateSource("proc hello() = echo 'hi'", lfNim)
echo r.errors # seq[ValidationError]
# Auto-detect language
let r2 = validateSource("print('hello')", lfUnknown) # detects Python
# Validate a file
let r3 = validateFile("path/to/file.nim", lfNim)
# Get JSON diagnostics
echo r.toJson().pretty()
# Inspect source structure
let info = inspectSource("class Foo: ...", lfPython)
echo $info # JSON with class/function info
CLI Usage
When compiled as a standalone binary:
validatrix validate --file=source.nim
validatrix validate --source="print('hi')" --flavor=python
validatrix inspect --file=source.py
validatrix detect --file=unknown.txt
API Reference
Core Functions
| Function | Description |
|---|---|
validateSource(source, flavor, options, sourcePath) |
Validate source code string |
validateFile(filePath, flavor, options) |
Validate a file |
inspectSource(source, flavor, options, sourcePath) |
Return structural diagnostics as JSON |
inspectFile(filePath, flavor, options) |
Return structural diagnostics for a file as JSON |
detectFlavor(source, filePath) |
Auto-detect language flavor |
supportedFlavors() |
List all registered language flavors |
Types
ValidationResult— containserrors: seq[ValidationError],valid: bool,moduleInfo,debugOutput,detectionInfoValidationError— containscode,message,severity,position,hint,contextValidationOptions— containsflavor,debugMode,maxErrors,validateAllLanguageFlavor— enum:lfUnknown,lfNim,lfBash,lfPython,lfJavaScript,lfPHP,lfHTML,lfJinja,lfJSON,lfYAML,lfTOML
Error Codes
| Code | Meaning |
|---|---|
E1000 |
Unexpected/unmatched bracket |
E1001 |
Unclosed bracket |
E1002 |
Unmatched closing bracket |
E2000 |
Unclosed string literal |
E2001 |
Invalid string escape |
E2002 |
Unclosed multi-line string |
E3000 |
Unclosed comment |
E3001 |
Invalid comment syntax |
E4000 |
Invalid syntax |
E4001 |
Reserved word misuse |
E5000 |
Unclosed block/control structure |
E9999 |
Internal error (never-crash fallback) |
Supported Languages
| Language | File Extensions | Tokenizer Features |
|---|---|---|
| Nim | .nim, .nims, .nimble |
Block comments #[ ]# with nesting, triple-quoted strings, raw strings, doc comments |
| Bash | .sh, .bash |
Shebang detection, heredocs, command substitution, variable expansion, fi/done/esac matching |
| Python | .py |
F-strings with nesting, triple-quoted strings, decorators, async/await, match statements |
| JavaScript | .js, .jsx, .mjs, .cjs |
Template literals with nesting, regex literals, arrow functions, ESM imports |
| PHP | .php |
<?php tags, heredocs/nowdocs, variable variables |
| HTML | .html, .htm |
Tag balancing, self-closing tags, attributes |
| Jinja | .j2, .jinja, .html.j2 |
{% %}, {{ }}, {# #} block detection, nested blocks |
| JSON | .json |
Bracket balance, string validation, comma checking |
| YAML | .yaml, .yml |
Indentation tracking, key-value checking |
| TOML | .toml |
Table headers, bracket balance, string validation |
Building
# Build the library
nim c src/validatrix.nim
# Build with debug mode
nim c -d:validatrixDebug src/validatrix.nim
# Run all tests
nim c -r tests/test_all.nim
# Build standalone binary
nim c -d:release src/validatrix.nim
Testing
The test suite covers 256 test cases across all supported languages:
- 25-30 tests per language including edge cases
- Fuzz tests — null bytes, binary data, deep nesting (100 levels), unicode bombs, empty sources
- Mixed-file validators — HTML+Jinja combined files
- Config formats — JSON, YAML, TOML validation
- Concurrent validation — thread safety under parallel calls
- Never-crash guarantee — every test verifies invalid input returns graceful errors, not crashes
Architecture
src/validatrix/
validatrix.nim # Public API entry point
core/
types.nim # Core types: ValidationResult, ValidationError, LanguageFlavor
tokenizerbase.nim # Abstract tokenizer base class
validatorbase.nim # Abstract validator base class
detector.nim # Language auto-detection
debug.nim # Debug logging infrastructure
tokenizers/
nim_tokenizer.nim
bash_tokenizer.nim
python_tokenizer.nim
javascript_tokenizer.nim
php_tokenizer.nim
html_tokenizer.nim
jinja_tokenizer.nim
languages/
nim_validator.nim
bash_validator.nim
python_validator.nim
javascript_validator.nim
php_validator.nim
html_validator.nim
jinja_validator.nim
config_validators.nim # JSON, YAML, TOML validators
reporting/
errors.nim # Error formatting and JSON output
License
MIT
Author
molodetz — DevPlace Code
Description
Based dependency free syntax checker for many common programming languages. We are too cool for regex, everything is done using lexing and AST like it is supposed to be.
126 KiB
Languages
Nim
99.3%
Makefile
0.7%