restqueryparser

package module
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2023 License: Apache-2.0 Imports: 6 Imported by: 0

README

Rest Query Parser

GoDoc Coverage Status

Example

package restfqueryparser_test

import (
	"errors"
	"net/url"
	"testing"

	"github.com/stretchr/testify/assert"
	rqp "github.com/gmodx/rest-query-parser"
)

func Test_Parse(t *testing.T) {
	url, _ := url.Parse("http://localhost/?sort=name.desc&sort=id.asc&offset=99&limit=10&id=1&i[eq]=5&s[eq]=one&email[gt]=11")
	q, err := rqp.Parse(url.Query(), rqp.Validations{
		"limit":  rqp.MinMax(10, 100),
		"sort":   rqp.In("id", "name"),
		"s":      rqp.In("one", "two"),
		"id:int": nil,
		"i:int": func(value interface{}) error {
			if value.(int) > 1 && value.(int) < 10 {
				return nil
			}
			return errors.New("i: must be greater then 1 and lower then 10")
		},
		"email": nil,
		"name":  nil,
	})

	if err != nil {
		t.Error(err)
		return
	}

	assert.Equal(t, "name", q.Sorts[0].By)
	assert.Equal(t, true, q.Sorts[0].Desc)

	assert.Equal(t, "id", q.Sorts[1].By)
	assert.Equal(t, false, q.Sorts[1].Desc)

	assert.Equal(t, 99, q.Offset)
	assert.Equal(t, 10, q.Limit)

	for _, f := range q.Filters {
		switch f.Name {
		case "id":
			assert.Equal(t, rqp.FilterMethod_EQ, f.Method)
			assert.Equal(t, 1, f.Value)
		case "i":
			assert.Equal(t, rqp.FilterMethod_EQ, f.Method)
			assert.Equal(t, 5, f.Value)
		case "s":
			assert.Equal(t, rqp.FilterMethod_EQ, f.Method)
			assert.Equal(t, "one", f.Value)
		case "email":
			assert.Equal(t, rqp.FilterMethod_GT, f.Method)
			assert.Equal(t, "11", f.Value)
		}
	}
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrBadFormat  = errors.New("bad format")
	ErrNotInScope = errors.New("not in scope")
	ErrEmptyValue = errors.New("empty value")
)
View Source
var (
	ErrUnknownMethod = errors.New("unknown method")
)

Functions

This section is empty.

Types

type Filter

type Filter struct {
	Name   string
	Method FilterMethod
	Value  interface{}
}

type FilterMethod

type FilterMethod string
const (
	FilterMethod_EQ  FilterMethod = "equal"
	FilterMethod_NE  FilterMethod = "not_equal"
	FilterMethod_GT  FilterMethod = "greater_than"
	FilterMethod_LT  FilterMethod = "lowwer_than"
	FilterMethod_GTE FilterMethod = "greater_than_equal"
	FilterMethod_LTE FilterMethod = "lowwer_than_equal"
)

type Query

type Query struct {
	Offset  int
	Limit   int
	Sorts   []Sort
	Filters []Filter
	// contains filtered or unexported fields
}

func New

func New() *Query

func Parse

func Parse(q url.Values, v Validations) (*Query, error)

func (*Query) Parse

func (q *Query) Parse() (err error)

func (*Query) SetUrlQuery

func (q *Query) SetUrlQuery(query url.Values) *Query

func (*Query) SetValidations

func (q *Query) SetValidations(v Validations) *Query

type Sort

type Sort struct {
	By   string
	Desc bool
}

type ValidationFunc

type ValidationFunc func(value interface{}) error

func In

func In(values ...interface{}) ValidationFunc

func Max

func Max(max int) ValidationFunc

func Min

func Min(min int) ValidationFunc

func MinMax

func MinMax(min, max int) ValidationFunc

func NotEmpty

func NotEmpty() ValidationFunc

type Validations

type Validations map[string]ValidationFunc

func (Validations) GetFieldType

func (vs Validations) GetFieldType(name string) string

func (Validations) GetValidFunc

func (vs Validations) GetValidFunc(fieldName string) ValidationFunc

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL