Files
audita/internal/validators/registry.go

101 lines
3.4 KiB
Go

package validators
import (
"fmt"
"strings"
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
"gitea.maximumdirect.net/eric/audita/internal/validators/confidence_threshold"
"gitea.maximumdirect.net/eric/audita/internal/validators/editorial_review"
"gitea.maximumdirect.net/eric/audita/internal/validators/meaning_reversal_review"
validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata"
"gitea.maximumdirect.net/eric/audita/internal/validators/no_effect"
"gitea.maximumdirect.net/eric/audita/internal/validators/non_empty_corrected_text"
"gitea.maximumdirect.net/eric/audita/internal/validators/original_text_presence"
"gitea.maximumdirect.net/eric/audita/internal/validators/proposal_shape"
"gitea.maximumdirect.net/eric/audita/internal/validators/protected_terms"
"gitea.maximumdirect.net/eric/audita/internal/validators/spoken_form_plausibility"
)
const (
KeyProposalShape = validatormetadata.KeyProposalShape
KeyConfidenceThreshold = validatormetadata.KeyConfidenceThreshold
KeyOriginalTextPresence = validatormetadata.KeyOriginalTextPresence
KeyNonEmptyCorrectedText = validatormetadata.KeyNonEmptyCorrectedText
KeyNoEffect = validatormetadata.KeyNoEffect
KeyProtectedTerms = validatormetadata.KeyProtectedTerms
KeySpokenFormPlausibility = validatormetadata.KeySpokenFormPlausibility
KeyMeaningReversalReview = validatormetadata.KeyMeaningReversalReview
KeyEditorialReview = validatormetadata.KeyEditorialReview
)
type BuiltInValidatorDefinition struct {
Key string
Build func() (contracts.Validator, error)
}
type Registry struct {
definitions map[string]BuiltInValidatorDefinition
}
func NewBuiltInRegistry() *Registry {
defs := []BuiltInValidatorDefinition{
{Key: KeyProposalShape, Build: proposal_shape.New},
{Key: KeyConfidenceThreshold, Build: confidence_threshold.New},
{Key: KeyOriginalTextPresence, Build: original_text_presence.New},
{Key: KeyNonEmptyCorrectedText, Build: non_empty_corrected_text.New},
{Key: KeyNoEffect, Build: no_effect.New},
{Key: KeyProtectedTerms, Build: protected_terms.New},
{Key: KeySpokenFormPlausibility, Build: spoken_form_plausibility.New},
{Key: KeyMeaningReversalReview, Build: meaning_reversal_review.New},
{Key: KeyEditorialReview, Build: editorial_review.New},
}
m := make(map[string]BuiltInValidatorDefinition, len(defs))
for _, def := range defs {
m[def.Key] = def
}
return &Registry{definitions: m}
}
func (r *Registry) Lookup(key string) (BuiltInValidatorDefinition, bool) {
if r == nil {
return BuiltInValidatorDefinition{}, false
}
def, ok := r.definitions[strings.TrimSpace(key)]
return def, ok
}
func (r *Registry) MustBuild(key string) (contracts.Validator, error) {
if r == nil {
return nil, fmt.Errorf("validator registry is nil")
}
def, ok := r.Lookup(key)
if !ok {
return nil, fmt.Errorf("unknown validator key %q", key)
}
v, err := def.Build()
if err != nil {
return nil, fmt.Errorf("build validator %q: %w", key, err)
}
if v == nil {
return nil, fmt.Errorf("build validator %q: returned nil validator", key)
}
if v.Name() != def.Key {
return nil, fmt.Errorf("validator key/name mismatch for %q: got %q", key, v.Name())
}
return v, nil
}
func (r *Registry) RegisteredKeys() []string {
if r == nil {
return nil
}
keys := make([]string, 0, len(r.definitions))
for k := range r.definitions {
keys = append(keys, k)
}
return keys
}