forgedb-validation
Schema and HTTP validation for ForgeDB with position tracking, error reporting, and status code mapping.
Overview
The forgedb-validation crate provides validation capabilities for ForgeDB schemas and HTTP requests/responses. It includes:
- Schema validation - Naming conventions, duplicate checks, constraint validation
- HTTP validation - Request field validation, format checking, range validation
- Status code mapping - Automatic HTTP status code assignment for validation errors
- Error reporting - Rich error messages with position tracking and suggestions
Features
- Schema validation rules - Enforce snake_case for fields, PascalCase for models
- Constraint checking - Validate required fields, duplicates, type formats
- Position tracking - Track errors with line and column information
- Automatic suggestions - Provide helpful suggestions for fixing errors
- HTTP validation - Email, length, range, and required field validation
- Status code mapping - Consistent HTTP status codes for different error types
- Error formatting - Clear, actionable error messages with suggestions
- Zero dependencies - Minimal, focused crate with no external dependencies
Schema Validation
Naming Conventions
ForgeDB enforces consistent naming conventions to ensure clean, readable schemas:
Field Names (snake_case)
Fields must use snake_case: lowercase letters, digits, and underscores only.
use ;
// Valid field names
assert!;
assert!;
assert!;
assert!;
// Invalid field names - get helpful suggestions
let result = validate_field_name;
assert!;
// Error: "Field name 'UserName' must be in snake_case"
// Suggestion: "Consider using 'user_name'"
Model Names (PascalCase)
Models must use PascalCase: start with uppercase, no underscores.
use validate_model_name;
// Valid model names
assert!;
assert!;
assert!;
// Invalid model names - get helpful suggestions
let result = validate_model_name;
assert!;
// Error: "Model name 'user_model' must be in PascalCase"
// Suggestion: "Consider using 'UserModel'"
Position Tracking
Validation errors can track exact source code positions for precise error reporting:
use ;
let pos = new; // line 10, column 5
let result = validate_field_name;
match result
Duplicate Checking
Prevent duplicate field and model names in schemas:
use ;
// Check for duplicate fields
let fields = vec!;
let result = check_duplicate_fields;
assert!;
// Error at line 10: "Duplicate field name 'email'"
// Check for duplicate models
let models = vec!;
let result = check_duplicate_models;
assert!;
// Error at line 20: "Duplicate model name 'User'"
Case Conversion Utilities
Convert between naming conventions for suggestions and code generation:
use ;
// Convert to snake_case
assert_eq!;
assert_eq!;
assert_eq!;
// Convert to PascalCase
assert_eq!;
assert_eq!;
HTTP Validation
Request Validation
Validate HTTP request data with built-in validators:
Required Fields
use HttpValidator;
let fields = vec!;
match validate_required_fields
Email Validation
use HttpValidator;
// Valid emails
assert!;
assert!;
// Invalid emails - get helpful suggestions
let result = validate_email;
assert!;
// Error: "Invalid email format"
// Suggestion: "Email must contain @ and domain"
String Length Validation
use HttpValidator;
// Validate string length (min: 2, max: 10)
assert!;
// Too short
let result = validate_length;
assert!;
// Error: "Field 'name' must be at least 2 characters"
// Too long
let result = validate_length;
assert!;
// Error: "Field 'name' must be at most 10 characters"
Numeric Range Validation
use HttpValidator;
// Validate numeric range (min: 0, max: 150)
assert!;
// Below minimum
let result = validate_range;
assert!;
// Error: "Field 'age' must be at least 0"
// Above maximum
let result = validate_range;
assert!;
// Error: "Field 'age' must be at most 150"
HTTP Validation Errors
Map validation errors to appropriate HTTP status codes:
use ;
// Bad Request (400) - Invalid input
let error = bad_request;
assert_eq!;
assert!;
// Not Found (404)
let error = not_found;
assert_eq!;
// Conflict (409) - Uniqueness violation
let error = conflict;
assert_eq!;
// Unprocessable Entity (422) - Business logic validation
let error = unprocessable_entity;
assert_eq!;
// Internal Server Error (500)
let error = internal_error;
assert_eq!;
assert!;
Status Code Mapping
The StatusCodeMapper provides consistent HTTP status codes for different validation error types:
Error Type to Status Code
use StatusCodeMapper;
// Map validation error types to status codes
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
// Unknown types default to 400 (Bad Request)
assert_eq!;
Status Code Utilities
use StatusCodeMapper;
// Get human-readable status names
assert_eq!;
assert_eq!;
assert_eq!;
// Check status code categories
assert!; // 2xx
assert!; // 4xx
assert!; // 5xx
Usage Examples
Complete Schema Validation Example
use ;
match validate_schema
Complete HTTP Request Validation Example
use ;
// Valid registration
assert!;
// Invalid registration - missing fields
let result = validate_user_registration;
assert!;
Custom Validator Pattern
use ;
// Test custom validator
match validate_password
API Reference
Core Types
Position
Represents a position in source code for error reporting.
ValidationError
A validation error with optional position and suggestion.
// Implements Display for formatted error output
Example:
let error = new
.with_position
.with_suggestion;
println!;
// Output: "Error at line 10, column 5: Invalid field name"
// " Suggestion: Use snake_case naming"
ValidationResult<T>
Type alias for validation results.
pub type ValidationResult<T> = ;
Schema Validation Functions
Naming Convention Checks
// Check if string follows snake_case convention
;
// Check if string follows PascalCase convention
;
// Convert string to snake_case
;
// Convert string to PascalCase
;
Validation Functions
// Validate field name follows snake_case
;
// Validate model name follows PascalCase
;
// Check for duplicate field names
;
// Check for duplicate model names
;
HTTP Validation Types
HttpValidationError
HTTP-specific validation error with status code.
HttpValidator
HTTP request validation utilities.
;
StatusCodeMapper
HTTP status code mapping utilities.
;
Error Reporting
Position Information
Validation errors can track precise source code locations:
use ;
let error = new
.with_position;
println!;
// Output: "Error at line 42, column 8: Field name must be in snake_case"
Suggestions
Errors can include helpful suggestions for fixing issues:
use ValidationError;
let error = new
.with_suggestion;
println!;
// Output: "Error: Model name 'user_model' must be in PascalCase"
// " Suggestion: Consider using 'UserModel'"
Error Formatting
The Display implementation provides clear, formatted error messages:
use ;
// Error with position and suggestion
let error = new
.with_position
.with_suggestion;
println!;
// Output:
// Error at line 15, column 3: Invalid field name 'UserName'
// Suggestion: Use 'user_name' instead
// Error without position
let error = new;
println!;
// Output: Error: Email is required
Collecting Multiple Errors
Validate multiple fields and collect all errors:
use ;
let mut errors = Vecnew;
// Validate multiple fields
if let Err = validate_email
if let Err = validate_length
if let Err = validate_range
// Report all errors at once
if !errors.is_empty
Testing
Running Tests
Run all validation tests:
Run specific test module:
Run with output:
Test Coverage
The test suite includes comprehensive coverage:
Schema Validation Tests (lib_tests.rs):
- ✅ snake_case and PascalCase detection
- ✅ Case conversion (to_snake_case, to_pascal_case)
- ✅ Field name validation with suggestions
- ✅ Model name validation with suggestions
- ✅ Duplicate field detection
- ✅ Duplicate model detection
- ✅ Position tracking in errors
- ✅ Error formatting with/without suggestions
- ✅ Edge cases (single character, empty strings, special characters)
HTTP Validation Tests (http_tests.rs):
- ✅ HttpValidationError creation (all status codes)
- ✅ Client error vs server error detection
- ✅ Required field validation
- ✅ Email format validation
- ✅ String length validation
- ✅ Numeric range validation
Status Code Mapping Tests (status_tests.rs):
- ✅ Error type to status code mapping
- ✅ Status code name resolution
- ✅ Success/client error/server error detection
Example Test
use ;
Design Decisions
Why Position Tracking?
Position information enables:
- Precise error location in source files
- Better IDE integration (jump to error)
- Clear error messages for users
- Easier debugging during schema development
Why Separate Schema and HTTP Validation?
The crate separates concerns:
- Schema validation (
lib.rs) - Design-time validation of schema definitions - HTTP validation (
http.rs) - Runtime validation of HTTP requests - Status mapping (
status.rs) - Shared HTTP status code utilities
This separation allows:
- Using schema validation in parsers/compilers
- Using HTTP validation in web servers
- Minimal dependencies for each use case
Why Include Suggestions?
Automatic suggestions:
- Reduce cognitive load on users
- Speed up development cycle
- Teach naming conventions
- Prevent common mistakes
Zero Dependencies
The crate has no external dependencies, making it:
- Fast to compile
- Easy to audit
- Suitable for embedded use
- Minimal supply chain risk
Related Crates
- forgedb-parser: Uses validation for schema parsing errors
- forgedb-types: Defines types that are validated
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.