Validation rule registry for tracking and organizing validation rules.
This namespace provides a central registry for validation rules across all modules, enabling:
Rule Format: {:rule-id keyword ; Unique identifier (e.g., :user.email/required) :description string ; Human-readable description :category keyword ; :schema | :business | :cross-field | :context :module keyword ; Module name (e.g., :user, :billing) :fields [keyword] ; Affected fields :error-code keyword ; Default error code :validator-fn (fn [data] ...) ; Actual validation function :dependencies [rule-id] ; Required rules (optional) :metadata map} ; Additional metadata (optional)
Design Principles:
Validation rule registry for tracking and organizing validation rules.
This namespace provides a central registry for validation rules across
all modules, enabling:
- Rule discovery and documentation
- Coverage tracking
- Conflict detection
- Rule composition and reuse
Rule Format:
{:rule-id keyword ; Unique identifier (e.g., :user.email/required)
:description string ; Human-readable description
:category keyword ; :schema | :business | :cross-field | :context
:module keyword ; Module name (e.g., :user, :billing)
:fields [keyword] ; Affected fields
:error-code keyword ; Default error code
:validator-fn (fn [data] ...) ; Actual validation function
:dependencies [rule-id] ; Required rules (optional)
:metadata map} ; Additional metadata (optional)
Design Principles:
- Registry is atom-based for REPL-friendly development
- Thread-safe registration
- Immutable rule definitions
- Forward-compatible metadata extension(clear-registry!)Clear all rules from registry (primarily for testing).
Returns: Empty map
Clear all rules from registry (primarily for testing). Returns: Empty map
(find-conflicting-rules)Find rules with overlapping fields and categories that might conflict.
Args: None (uses registry)
Returns: Vector of conflict maps {:rule-ids [...] :reason string}
Find rules with overlapping fields and categories that might conflict.
Args:
None (uses registry)
Returns:
Vector of conflict maps {:rule-ids [...] :reason string}(find-duplicate-rule-ids rules)Find duplicate rule IDs in a collection of rules.
Args: rules: Collection of rule definitions
Returns: Set of duplicate rule-ids
Find duplicate rule IDs in a collection of rules. Args: rules: Collection of rule definitions Returns: Set of duplicate rule-ids
(get-all-rules)Get all registered rules.
Returns: Vector of rule definitions
Get all registered rules. Returns: Vector of rule definitions
(get-execution-count rule-id)Get execution count for a rule.
Args: rule-id: Rule identifier keyword
Returns: Integer execution count (0 if never executed)
Get execution count for a rule. Args: rule-id: Rule identifier keyword Returns: Integer execution count (0 if never executed)
(get-execution-stats)Get execution statistics for all rules.
Returns: Map with :total-rules, :executed-rules, :coverage-percent, :by-rule
Example: {:total-rules 50 :executed-rules 45 :coverage-percent 90.0 :by-rule {:user.email/required 100 :user.name/min-length 50 ...}}
Get execution statistics for all rules.
Returns:
Map with :total-rules, :executed-rules, :coverage-percent, :by-rule
Example:
{:total-rules 50
:executed-rules 45
:coverage-percent 90.0
:by-rule {:user.email/required 100
:user.name/min-length 50
...}}(get-rule rule-id)Retrieve a rule definition by id.
Args: rule-id: Rule identifier keyword
Returns: Rule definition map or nil
Retrieve a rule definition by id. Args: rule-id: Rule identifier keyword Returns: Rule definition map or nil
(get-rules-by-category category)Get all rules of a specific category.
Args: category: Category keyword (:schema, :business, :cross-field, :context)
Returns: Vector of rule definitions
Get all rules of a specific category. Args: category: Category keyword (:schema, :business, :cross-field, :context) Returns: Vector of rule definitions
(get-rules-by-module module)Get all rules for a specific module.
Args: module: Module keyword (e.g., :user, :billing)
Returns: Vector of rule definitions
Get all rules for a specific module. Args: module: Module keyword (e.g., :user, :billing) Returns: Vector of rule definitions
(get-rules-for-field field)Get all rules that validate a specific field.
Args: field: Field keyword
Returns: Vector of rule definitions
Get all rules that validate a specific field. Args: field: Field keyword Returns: Vector of rule definitions
(register-rule! rule)Register a validation rule in the global registry.
Args: rule: Rule definition map (must include :rule-id)
Returns: Registered rule definition
Throws: IllegalArgumentException if rule-id is missing or already registered
Example: (register-rule! {:rule-id :user.email/required :description "Email is required for user creation" :category :schema :module :user :fields [:email] :error-code :required :validator-fn (fn [data] (some? (:email data)))})
Register a validation rule in the global registry.
Args:
rule: Rule definition map (must include :rule-id)
Returns:
Registered rule definition
Throws:
IllegalArgumentException if rule-id is missing or already registered
Example:
(register-rule!
{:rule-id :user.email/required
:description "Email is required for user creation"
:category :schema
:module :user
:fields [:email]
:error-code :required
:validator-fn (fn [data] (some? (:email data)))})(register-rules! rules)Register multiple validation rules.
Args: rules: Collection of rule definition maps
Returns: Vector of registered rules
Example: (register-rules! [rule1 rule2 rule3])
Register multiple validation rules. Args: rules: Collection of rule definition maps Returns: Vector of registered rules Example: (register-rules! [rule1 rule2 rule3])
(registry-ready?)Check if registry is ready for use (has rules registered).
Returns: Boolean indicating readiness
Check if registry is ready for use (has rules registered). Returns: Boolean indicating readiness
(registry-stats)Get statistics about the rule registry.
Returns: Map with counts by module, category, etc.
Get statistics about the rule registry. Returns: Map with counts by module, category, etc.
(reset-execution-tracking!)Reset all execution tracking (for testing/benchmarking).
Returns: Empty map
Reset all execution tracking (for testing/benchmarking). Returns: Empty map
(track-rule-execution! rule-id)Record that a rule was executed (for coverage reporting).
Args: rule-id: Rule identifier keyword
Returns: Updated execution count
Record that a rule was executed (for coverage reporting). Args: rule-id: Rule identifier keyword Returns: Updated execution count
(unregister-rule! rule-id)Remove a rule from the registry (primarily for testing).
Args: rule-id: Rule identifier keyword
Returns: Removed rule definition or nil
Remove a rule from the registry (primarily for testing). Args: rule-id: Rule identifier keyword Returns: Removed rule definition or nil
(valid-rule? rule)Check if rule definition is valid.
Args: rule: Rule definition map
Returns: Boolean indicating validity
Check if rule definition is valid. Args: rule: Rule definition map Returns: Boolean indicating validity
(validate-rule rule)Validate rule definition and return errors.
Args: rule: Rule definition map
Returns: Vector of error strings (empty if valid)
Validate rule definition and return errors. Args: rule: Rule definition map Returns: Vector of error strings (empty if valid)
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |