builder

package module
v0.11.0 Latest Latest
Warning

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

Go to latest
Published: Jun 27, 2026 License: Apache-2.0 Imports: 10 Imported by: 2

README

Expression Builder 🔨

GoDoc Version Build Status Go Report Card Codecov

Safe queries from URL query strings

Expression Builder works with the exp expression library to define templates that are safely populated with data from a URL query string.


func Handler(r *http.Request, w http.ResponseWriter) {

	// Define the URL arguments you want to allow and their types
	b := NewBuilder().
		String("firstName").
		String("lastName").
		Int("publishDate").
		Bool("isPublished")

	// Create a usable expression from the URL query string
	expression := b.Evaluate(r.URL.Query())

	// Next, safely pass it into the database, or something...
}

Operators

By default each parameter is compared with =. A query value may override this with an OP:value prefix, where OP is one of the operator aliases recognized by exp (EQ, NE, GT, GTE, LT, LTE, CONTAINS, BEGINS, case-insensitive):

?publishDate=gt:1000      // publishDate >  1000
?firstName=ne:John        // firstName  != "John"
?lastName=BEGINS:Mc       // lastName begins with "Mc"

A field's default operator can also be set in code with WithDefaultOperator (and the WithDefaultOp* shortcuts). Repeating a parameter (?firstName=a&firstName=b) combines the values with OR; distinct parameters combine with AND.

What matters here

  • The OP:value prefix is the core feature, and it is invisible from the constructor API. Only the first : splits operator from value, so EQ:a:b:c parses as = / a:b:c. An unrecognized operator prefix is not an error — the default operator is used and the whole string (prefix included) becomes the value.

  • Only allow-listed fields produce predicates. Evaluate ignores any URL parameter whose name was not registered on the Builder, and silently drops values that fail to parse for their data type. This is the safety guarantee — unknown or malformed input never reaches the expression.

  • Polygon ignores the operator prefix and always emits GEO-WITHIN. Unlike every other type, the parsed operator is discarded for polygons. The prefix is stripped before parsing the coordinates (so eq:1,2,3,4 works), but the comparison operator is fixed.

  • Evaluate vs. EvaluateAll. Evaluate includes only the fields present in the URL; EvaluateAll requires every registered field to be present and non-empty, returning an error otherwise.

Pull Requests Welcome

This library is a work in progress, and will benefit from your experience reports, use cases, and contributions. If you have an idea for making this library better, send in a pull request. We're all in this together! 🔨

Documentation

Overview

Package builder generates dynamic expressions based on a set of url.Values and a map of allowed fields. It supports several different data types, along with a simple list of operators that can be applied to each predicate.

Index

Constants

View Source
const DataTypeBool = "BOOL"

DataTypeBool represents a boolean parameter

View Source
const DataTypeInt = "INT"

DataTypeInt represents an integer parameter

View Source
const DataTypeInt64 = "INT64"

DataTypeInt64 represents a 64-bit integer parameter

View Source
const DataTypeObjectID = "OBJECTID"

DataTypeObjectID represents a mongodb "ObjectId" parameter (24-byte hex string)

View Source
const DataTypePolygon = "POLYGON"

DataTypePolygon represents a GeoJSON polygon

View Source
const DataTypeString = "STRING"

DataTypeString represents a string parameter

View Source
const DataTypeTime = "TIME"

DataTypeTime represents a time.Time parameter

Variables

This section is empty.

Functions

This section is empty.

Types

type Builder

type Builder map[string]Field

Builder maps URL parameter names to the Fields that describe how to turn their values into an expression.

func NewBuilder

func NewBuilder() Builder

NewBuilder returns an empty Builder.

func (Builder) Bool

func (b Builder) Bool(name string, options ...FieldOption) Builder

Bool adds a boolean-based parameter to the expression Builder

func (Builder) Evaluate

func (b Builder) Evaluate(values url.Values) exp.Expression

Evaluate returns an Expression based on the specific url.Values provided

func (Builder) EvaluateAll added in v0.5.0

func (b Builder) EvaluateAll(values url.Values) (exp.Expression, error)

EvaluateAll is like Evaluate, but every field defined in the Builder must be present and non-empty in the URL values. It returns an error if any is missing.

func (Builder) EvaluateField added in v0.7.0

func (b Builder) EvaluateField(field Field, values []string) exp.Expression

EvaluateField converts the raw URL values for a single field into an expression, parsing each value according to the field's data type.

func (Builder) HasURLParams added in v0.5.0

func (b Builder) HasURLParams(values url.Values) bool

HasURLParams returns TRUE if the URL contains any parameters that match the Builder. It does not test the validity of those values.

func (Builder) Int

func (b Builder) Int(name string, options ...FieldOption) Builder

Int adds an integer-based parameter to the expression Builder

func (Builder) Int64 added in v0.7.0

func (b Builder) Int64(name string, options ...FieldOption) Builder

Int64 adds a 64-bit integer-based parameter to the expression Builder

func (Builder) ObjectID

func (b Builder) ObjectID(name string, options ...FieldOption) Builder

ObjectID adds a mongodb ObjectID-based parameter to the expression Builder

func (Builder) Polygon added in v0.10.7

func (b Builder) Polygon(name string, options ...FieldOption) Builder

Polygon adds a GeoJSON polygon-based parameter to the expression Builder

func (Builder) String

func (b Builder) String(name string, options ...FieldOption) Builder

String adds a string-based parameter to the expression Builder

func (Builder) Time added in v0.10.0

func (b Builder) Time(name string, options ...FieldOption) Builder

Time adds a time-based parameter to the expression Builder

type Field added in v0.7.7

type Field struct {
	Name     string
	DataType string
	Operator string
	Filters  []Filter
}

Field describes a single queryable parameter: the expression field name, its data type, the default comparison operator, and any input filters.

func NewField added in v0.7.7

func NewField(name string, dataType string, options ...FieldOption) Field

NewField returns a Field for the given name and data type, applying any options in order.

type FieldOption added in v0.7.7

type FieldOption func(*Field)

FieldOption is a function that configures a Field during construction.

func WithAlias added in v0.7.7

func WithAlias(name string) FieldOption

WithAlias defines the field name to use when creating an expression, which may be different from the field name to read from the URL.

func WithDefaultOpBeginsWith added in v0.8.3

func WithDefaultOpBeginsWith() FieldOption

WithDefaultOpBeginsWith defines "BEGINS" as the default operator to use when creating an expression.

func WithDefaultOpContains added in v0.7.7

func WithDefaultOpContains() FieldOption

WithDefaultOpContains defines "CONTAINS" as the default operator to use when creating an expression.

func WithDefaultOpEqual added in v0.7.7

func WithDefaultOpEqual() FieldOption

WithDefaultOpEqual defines "EQUAL" as the default operator to use when creating an expression.

func WithDefaultOperator added in v0.7.7

func WithDefaultOperator(operator string) FieldOption

WithDefaultOperator defines the default operator to use when creating an expression

func WithFilter added in v0.9.0

func WithFilter(filter Filter) FieldOption

WithFilter adds a filter that transforms each input value before it is converted to the field's data type and compared.

type Filter added in v0.9.0

type Filter func(string) string

Filter transforms an input string before it is converted and compared.

Jump to

Keyboard shortcuts

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