Skip to content
Snippets Groups Projects
Commit 14b9ee70 authored by Semyon Krestyaninov's avatar Semyon Krestyaninov :dog2:
Browse files

wip

parent ee199806
No related branches found
No related tags found
No related merge requests found
package validate
import "context"
type Evaluator interface {
Evaluate(ctx context.Context, tmpl string) (string, error)
}
func EvaluateAll(ctx context.Context, evaluator Evaluator, tmpls []string) ([]string, error) {
result := make([]string, 0, len(tmpls))
for _, tmpl := range tmpls {
eval, err := evaluator.Evaluate(ctx, tmpl)
if err != nil {
return nil, err
}
result = append(result, eval)
}
return result, nil
}
type TemplateEvaluatorContext map[string]any
// TemplateEvaluator TODO implement Evaluator
type TemplateEvaluator struct {
ctx TemplateEvaluatorContext
}
package validate
import (
"context"
"git.perx.ru/perxis/perxis-go/pkg/schema/field"
)
type collectionFilter struct {
ID []string `json:"id"`
Name []string `json:"name"`
Tag []string `json:"tag"`
Hidden bool `json:"hidden"`
NoData bool `json:"no_data"`
}
func (f collectionFilter) GetName() string {
return "collection_filter"
}
func (f *collectionFilter) Evaluate(ctx context.Context, evaluator Evaluator) error {
var err error
f.ID, err = EvaluateAll(ctx, evaluator, f.ID)
if err != nil {
return err
}
f.Name, err = EvaluateAll(ctx, evaluator, f.Name)
if err != nil {
return err
}
f.Tag, err = EvaluateAll(ctx, evaluator, f.Tag)
if err != nil {
return err
}
return nil
}
func (f collectionFilter) Validate(_ context.Context, field *field.Field, _ interface{}) error {
return nil
}
func (f collectionFilter) ValidateOption() error {
return nil
}
type itemFilter struct {
Query []string `json:"query"`
QueryError string `json:"query_error"`
Hidden bool `json:"hidden"`
Template bool `json:"template"`
}
func (f itemFilter) GetName() string {
return "item_filter"
}
func (f *itemFilter) Evaluate(ctx context.Context, evaluator Evaluator) error {
var err error
f.Query, err = EvaluateAll(ctx, evaluator, f.Query)
if err != nil {
return err
}
f.QueryError, err = evaluator.Evaluate(ctx, f.QueryError)
if err != nil {
return err
}
return nil
}
func (f itemFilter) Validate(_ context.Context, field *field.Field, _ interface{}) error {
return nil
}
func (f itemFilter) ValidateOption() error {
return nil
}
package validate
import (
"context"
"strings"
"testing"
"text/template"
"github.com/stretchr/testify/assert"
)
type testEvaluator struct{}
func (e testEvaluator) Evaluate(ctx context.Context, tmpl string) (string, error) {
var b strings.Builder
t, err := template.New("").Parse(tmpl)
if err != nil {
return "", err
}
err = t.Execute(&b, map[string]any{
"name": "Ivan",
})
if err != nil {
return "", err
}
return strings.TrimSpace(b.String()), nil
}
func TestItemFilter_Evaluate(t *testing.T) {
tests := []struct {
name string
input itemFilter
want itemFilter
assertErr assert.ErrorAssertionFunc
}{
{
name: "query",
input: itemFilter{
Query: []string{
"name == '{{ .name }}'",
},
},
want: itemFilter{
Query: []string{
"name == 'Ivan'",
},
},
assertErr: assert.NoError,
},
{
name: "query with expression",
input: itemFilter{
Query: []string{
"{{ if .name }} name == 'Ivan' {{ else }} name == 'Oleg' {{ end }}",
},
},
want: itemFilter{
Query: []string{
"name == 'Ivan'",
},
},
assertErr: assert.NoError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.input.Evaluate(context.Background(), testEvaluator{})
tt.assertErr(t, err)
assert.Equal(t, tt.want, tt.input)
})
}
}
...@@ -96,4 +96,6 @@ func init() { ...@@ -96,4 +96,6 @@ func init() {
field.RegisterOption(required(true)) field.RegisterOption(required(true))
field.RegisterOption(maxItems(0)) field.RegisterOption(maxItems(0))
field.RegisterOption(schema(true)) field.RegisterOption(schema(true))
field.RegisterOption(collectionFilter{})
field.RegisterOption(itemFilter{})
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment