Files
gulie/gulie/rule.scm
2026-04-01 23:35:50 +02:00

62 lines
1.8 KiB
Scheme

;;; (gulie rule) — rule record type, registry, convenience macros
;;;
;;; Rules are the units of analysis. Each rule has a name, metadata,
;;; and a check procedure whose signature depends on the rule type.
(define-module (gulie rule)
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-1)
#:export (<rule>
make-rule
rule?
rule-name
rule-description
rule-severity
rule-category
rule-type
rule-check-proc
rule-fix-proc
register-rule!
all-rules
rules-of-type
find-rule
clear-rules!))
;; A lint/format rule.
(define-record-type <rule>
(make-rule name description severity category type check-proc fix-proc)
rule?
(name rule-name) ;; symbol
(description rule-description) ;; string
(severity rule-severity) ;; symbol: error | warning | info
(category rule-category) ;; symbol: format | style | correctness | idiom
(type rule-type) ;; symbol: line | cst | tree-il
(check-proc rule-check-proc) ;; procedure
(fix-proc rule-fix-proc)) ;; procedure | #f
;; Global rule registry.
(define *rules* '())
(define (register-rule! rule)
"Register a rule in the global registry."
(set! *rules* (cons rule *rules*)))
(define (all-rules)
"Return all registered rules."
(reverse *rules*))
(define (rules-of-type type)
"Return all registered rules of the given TYPE."
(filter (lambda (r) (eq? (rule-type r) type))
*rules*))
(define (find-rule name)
"Find a rule by NAME, or #f."
(find (lambda (r) (eq? (rule-name r) name))
*rules*))
(define (clear-rules!)
"Clear all registered rules. Useful for testing."
(set! *rules* '()))