Files

63 lines
1.9 KiB
Go
Raw Permalink Normal View History

2026-07-07 21:32:56 +00:00
package validjson
import (
"context"
"encoding/json"
"gitea.maximumdirect.net/eric/notarius/internal/framework/contracts"
"gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline"
)
const Key = "generic/valid_json"
const ReasonCodeInvalidJSON = "invalid_json"
2026-07-17 07:02:30 +00:00
type Options struct{}
2026-07-07 21:32:56 +00:00
type Validator struct{}
2026-07-17 07:02:30 +00:00
var _ contracts.SerializedValidator = (*Validator)(nil)
func New(Options) *Validator { return &Validator{} }
func (v *Validator) Name() string { return Key }
func (v *Validator) ExecutionClass() contracts.ExecutionClass {
return contracts.ExecutionClassDeterministic
2026-07-07 21:32:56 +00:00
}
2026-07-17 07:02:30 +00:00
func (v *Validator) Validate(_ context.Context, req contracts.SerializedValidationRequest) (contracts.ValidationResult, error) {
return validate(req.Content), nil
2026-07-07 21:32:56 +00:00
}
2026-07-17 07:02:30 +00:00
func validate(content []byte) contracts.ValidationResult {
if !json.Valid(content) {
return contracts.ValidationResult{Approved: false, ReasonCode: ReasonCodeInvalidJSON, Message: "payload is not valid JSON", CorrectionGuidance: "Return one complete replacement response encoded as valid JSON."}
2026-07-07 21:32:56 +00:00
}
2026-07-17 07:02:30 +00:00
return contracts.ValidationResult{Approved: true}
2026-07-07 21:32:56 +00:00
}
func Spec() pipeline.ValidatorSpec {
2026-07-17 07:02:30 +00:00
return pipeline.ValidatorSpec{Key: Key, ExecutionClass: contracts.ExecutionClassDeterministic}
2026-07-07 21:32:56 +00:00
}
func Register(registry *pipeline.ValidatorRegistry) error {
2026-07-17 08:13:08 +00:00
return pipeline.RegisterSerializedValidatorBuilder(registry, pipeline.SerializedValidatorSpec{
2026-07-17 07:02:30 +00:00
ValidatorSpec: Spec(), SupportsChunks: true, SupportsArtifacts: true,
}, validateOptions, func(request pipeline.BuildRequest) (contracts.SerializedValidator, error) {
options, err := DecodeOptions(request.Options)
if err != nil {
return nil, err
}
return New(options), nil
2026-07-07 21:32:56 +00:00
})
}
2026-07-17 07:02:30 +00:00
func DecodeOptions(options map[string]any) (Options, error) {
if err := pipeline.RejectUnknownOptions(options); err != nil {
return Options{}, err
}
return Options{}, nil
}
func validateOptions(options map[string]any) error { _, err := DecodeOptions(options); return err }