values

package
v1.1.1 Latest Latest
Warning

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

Go to latest
Published: Apr 10, 2026 License: MIT Imports: 10 Imported by: 0

Documentation

Overview

Package values is an internal package that defines methods such as sorting, comparison, and type conversion, that apply to interface types.

It is similar to, and makes heavy use of, the reflect package.

Since the intent is to provide runtime services for the Liquid expression interpreter, this package does not implement "generic" generics. It attempts to implement Liquid semantics (which are largely Ruby semantics).

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Call

func Call(fn reflect.Value, args []any) (any, error)

Call applies a function to arguments, converting them as necessary.

The conversion follows Liquid (Ruby?) semantics, which are more aggressive than Go conversion.

The function should return one or two values; the second value, if present, should be an error.

func Convert

func Convert(value any, typ reflect.Type) (any, error)

Convert value to the type. This is a more aggressive conversion, that will recursively create new map and slice values as necessary. It doesn't handle circular references. #nosec G115

func Equal

func Equal(a, b any) bool

Equal returns a bool indicating whether a == b after conversion.

func IsBlank

func IsBlank(value any) bool

IsBlank returns true if value is nil, false, an empty or whitespace-only string, an empty array, or an empty map — matching Liquid blank? semantics. Uses reflect.Kind so that defined types (e.g. type MyBool bool, type MyStr string) are handled the same way as their underlying built-in types.

func IsEmpty

func IsEmpty(value any) bool

IsEmpty returns true if value is an empty string, empty array, or empty map according to Liquid semantics. nil and false are NOT empty.

func Length

func Length(value any) int

Length returns the length of a string or array. In keeping with Liquid semantics, and contra Go, it does not return the size of a map.

func Less

func Less(a, b any) bool

Less returns a bool indicating whether a < b.

func MustConvert

func MustConvert(value any, t reflect.Type) any

MustConvert is like Convert, but panics if conversion fails.

func MustConvertItem

func MustConvertItem(item any, array any) any

MustConvertItem converts item to conform to the type array's element, else panics. Unlike MustConvert, the second argument is a value not a type.

func NormalizeNumber

func NormalizeNumber(v any) any

NormalizeNumber converts any Go numeric scalar to one of three canonical types: int64 (signed integers), uint64 (unsigned integers), or float64. Non-numeric values are returned unchanged.

func ParseDate

func ParseDate(s string) (time.Time, error)

ParseDate tries a few heuristics to parse a date from a string

func Sort

func Sort(data []any)

Sort any []any value. nil elements are sorted last (matching Ruby Liquid).

func SortByProperty

func SortByProperty(data []any, key string, nilFirst bool)

SortByProperty sorts maps on their key indices.

func ToLiquid

func ToLiquid(value any) any

ToLiquid converts an object to Liquid, if it implements the Drop interface.

func Truthy added in v1.1.0

func Truthy(value any) bool

Truthy returns true if value is truthy in Liquid semantics. Only nil and false (or defined bool types whose value is false) are falsy. This is the canonical truthiness gate for all condition evaluation. Uses reflect.Kind so defined types (e.g. type MyBool bool) work correctly.

Types

type CallParityError

type CallParityError struct{ NumArgs, NumParams int }

A CallParityError is a mismatch between the argument and parameter counts.

func (*CallParityError) Error

func (e *CallParityError) Error() string

type ContextAccess

type ContextAccess interface {
	Get(name string) any
	Set(name string, value any)
}

ContextAccess is the minimal interface injected into drops that implement ContextSetter. It provides read/write access to the current rendering scope. Mirrors Ruby Liquid's Context object (limited to variable bindings).

type ContextSetter

type ContextSetter interface {
	SetContext(ctx ContextAccess)
}

ContextSetter is an optional interface for drop types that want to receive the current rendering context when they are looked up from the variable scope. SetContext is called by the renderer each time the drop is accessed. This mirrors Ruby Liquid's context= setter.

type LiquidSentinel

type LiquidSentinel interface {
	// contains filtered or unexported methods
}

LiquidSentinel is implemented exclusively by EmptyDrop and BlankDrop. Tagging these special singletons with this interface lets the expression evaluator preserve their identity through the evaluation pipeline (instead of discarding it via .Interface()), enabling correct case/when comparisons.

The unexported method prevents external packages from accidentally implementing this interface (sealed interface pattern).

type Range

type Range struct {
	// contains filtered or unexported fields
}

A Range is the range of integers from b to e inclusive.

func NewRange

func NewRange(b, e int) Range

NewRange returns a new Range

func (Range) AsArray

func (r Range) AsArray() []any

AsArray converts the range into an array.

func (Range) Index

func (r Range) Index(i int) any

Index is in the iteration interface

func (Range) Len

func (r Range) Len() int

Len is in the iteration interface

func (Range) String

func (r Range) String() string

String renders a Range as "start..end", matching Ruby Liquid output.

type SafeValue

type SafeValue struct {
	Value interface{}
}

SafeValue is a wrapped interface{} to mark it as being safe so that auto-escape is not applied. It is used by the 'safe' filter which is added when (*Engine).SetAutoEscapeReplacer() is called.

type TypeError

type TypeError string

A TypeError is an error during type conversion.

func (TypeError) Error

func (e TypeError) Error() string

type Value

type Value interface {
	// Value retrieval
	Interface() any
	Int() int

	// Comparison
	Equal(Value) bool
	Less(Value) bool

	Contains(Value) bool
	IndexValue(Value) Value
	PropertyValue(Value) Value

	// Predicate
	Test() bool
}

A Value is a Liquid runtime value.

var BlankDrop Value = &blankDropValue{}

BlankDrop is the singleton for the `blank` keyword. After PRE-A lands, the scanner will resolve the `blank` literal directly to this value instead of treating it as an undefined variable.

var EmptyDrop Value = &emptyDropValue{}

EmptyDrop is the singleton for the `empty` keyword. After PRE-A lands, the scanner will resolve the `empty` literal directly to this value instead of treating it as an undefined variable.

func ValueOf

func ValueOf(value any) Value

ValueOf returns a Value that wraps its argument. If the argument is already a Value, it returns this.

Jump to

Keyboard shortcuts

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