ata-validator-crystal
ata-validator-crystal
Crystal bindings for ata-validator — a high-performance C++20 JSON Schema validator.
The C++ core uses simdjson and the RE2 regex engine; this shard only wraps its pure C API (ata_c.h). Struct layouts and function signatures match ata_c.h exactly.
Install
Add to shard.yml:
dependencies:
ata-validator-crystal:
github: groophylifefor/ata-validator-crystal
version: ~> 0.1.0
shards install
Native library
Two parts are required:
ata.lib(orlibata.a) — at link time, passed tocrystal buildvia/LIBPATH(Windows/MSVC) or-L(Unix)ata.dll(orlibata.so) — at runtime, next to the executable, onPATH, or pointed to byATA_VALIDATOR_LIB
To build the library into libata/ (the ata-validator source must be a sibling directory):
crystal run scripts/build_native.cr
This script compiles the shared library in ata-validator with CMake and copies libata/ata.dll + libata/ata.lib into the package root. (Default source path is ../../ata-validator; override with the ATA_VALIDATOR_SRC env var.)
Build
Windows (MSVC linker):
crystal build src/main.cr --link-flags "/LIBPATH:ata-validator-crystal/libata"
Linux/macOS:
crystal build src/main.cr --link-flags "-Lata-validator-crystal/libata -lata"
Usage
require "ata-validator-crystal"
schema = <<-JSON
{
"type": "object",
"properties": {
"name": {"type": "string", "minLength": 1},
"age": {"type": "integer", "minimum": 0}
},
"required": ["name"]
}
JSON
puts "ata v#{AtaValidator.version}"
# Reuse a compiled schema
validator = AtaValidator::Validator.new(schema)
result = validator.validate(%({"name": "Mert", "age": 28}))
puts result.valid # => true
result = validator.validate(%({"age": -1}))
puts result.valid # => false
result.errors.each do |e|
puts "#{e.path}: #{e.message}" # => /age: value -1.000000 < minimum 0.000000
end
validator.valid?(%({"name": "Mert"})) # => true (quick boolean check)
validator.close
# One-shot (compiles the schema on every call)
AtaValidator.validate(schema, %({"name": "Mert"})).valid
API
AtaValidator.version : StringAtaValidator::Validator.new(schema_json)— compiles the schema oncevalidate(json) : ValidationResult(valid+errors)valid?(json) : Boolclose/finalize— frees the compiled schema
AtaValidator.validate(schema_json, json) : ValidationResult— one-shot- Error types:
CompileError(invalid schema),ValidationError(path,message)
Test
crystal run scripts/build_native.cr
crystal spec --link-flags "/LIBPATH:libata"
License
MIT. The C++ core comes from ata-validator, MIT licensed (original copyright preserved in LICENSE).