101 lines
3.4 KiB
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
|
|
}
|