qs

package module
v0.0.0-...-ea548b3 Latest Latest
Warning

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

Go to latest
Published: Mar 1, 2024 License: MIT Imports: 6 Imported by: 0

README ¶

Experiment with query string parsing functions and generics

Is it possible to make a viable replacement for the abandoned gorilla/schema that makes manually decoding a query string into a struct a bit less brutal in Go?

It would be nicer if we could make it read a bit more left-to-right but that's impossible with generics at the moment.

Example:

type ID int

type Thingo struct {
    ID     ID
    Stuff  int
    Nilly  *int
    Yep    int64
    Floats []float64
    IP     *net.IP
}

func (t *Thingo) DecodeQueryValues(values qs.Values) error {
    q := qs.NewLoader(values)
    t.ID = qs.Val(qs.AnyInt[ID](q.First("id")))
    t.Stuff = qs.Val(qs.Int(q.First("stuff")))
    t.Nilly = qs.Ptr(qs.Int(q.First("nilly")))
    t.Yep = qs.Val(qs.Int64(q.First("yep")))
    t.Floats = qs.Val(qs.Float64s(q.Get("floats")))
    t.IP = qs.Val(qs.Text[net.IP](qs.First("ip")))
    return loader.Err()
}

Expectation Management

Don't use this for anything.

This is part of a personal grab-bag of utility code that I add to in a very ad-hoc fashion. No API stability guarantees are made, the code is not guaranteed to work, and anything may be removed at any time as I see fit.

I recommend you copy-paste pieces as-needed (including tests and license/attribution) into the internal/ folder of your projects rather than reference these modules directly as I may change the APIs in here without warning at any time.

Documentation ¶

Overview ¶

qs is a simple, experimental single-file copypasta library for query string handling: https://github.com/shabbyrobe/golib/blob/master/exp/qs

Index ¶

Constants ¶

This section is empty.

Variables ¶

This section is empty.

Functions ¶

func Decode ¶

func Decode(qs url.Values, into any) error

func May ¶

func May[T any](chain *Chain, in T, lastOk bool, lastErr error) (out T, ok bool)

func Ptr ¶

func Ptr[T any](chain *Chain, in T, lastOk bool, lastErr error) (out *T)

func Val ¶

func Val[T any](chain *Chain, in T, lastOk bool, lastErr error) (out T)

Types ¶

type Chain ¶

type Chain struct {
	Key string
	// contains filtered or unexported fields
}

func AnyBool ¶

func AnyBool[T ~bool](chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out T, ok bool, err error)

func AnyFloat64 ¶

func AnyFloat64[T ~float64](chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out T, ok bool, err error)

func AnyFloat64s ¶

func AnyFloat64s[T ~float64](chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []T, ok bool, err error)

func AnyInt ¶

func AnyInt[T ~int](chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out T, ok bool, err error)

func AnyInt64 ¶

func AnyInt64[T ~int64](chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out T, ok bool, err error)

func AnyInt64s ¶

func AnyInt64s[T ~int64](chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []T, ok bool, err error)

func AnyInts ¶

func AnyInts[T ~int](chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []T, ok bool, err error)

func AnyStr ¶

func AnyStr[T ~string](chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out T, ok bool, err error)

func AnyUint64 ¶

func AnyUint64[T ~uint64](chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out T, ok bool, err error)

func AnyUint64s ¶

func AnyUint64s[T ~uint64](chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []T, ok bool, err error)

func Bool ¶

func Bool(chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out bool, ok bool, err error)

func Float64 ¶

func Float64(chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out float64, ok bool, err error)

func Float64s ¶

func Float64s(chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []float64, ok bool, err error)

func Int ¶

func Int(chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out int, ok bool, err error)

func Int64 ¶

func Int64(chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out int64, ok bool, err error)

func Int64s ¶

func Int64s(chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []int64, ok bool, err error)

func Ints ¶

func Ints(chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []int, ok bool, err error)

func Text ¶

func Text[T any](chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out T, ok bool, err error)

func Texts ¶

func Texts[T any](chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []T, ok bool, err error)

func Uint64 ¶

func Uint64(chain *Chain, in string, lastOk bool, lastErr error) (next *Chain, out uint64, ok bool, err error)

func Uint64s ¶

func Uint64s(chain *Chain, ins []string, lastOk bool, lastErr error) (next *Chain, out []uint64, ok bool, err error)

func (*Chain) AddErr ¶

func (c *Chain) AddErr(err error) error

type Chainable ¶

type Chainable[I any, O any] func(
	chain *Chain,
	in I,
	lastOk bool,
	lastErr error,
) (
	next *Chain,
	out O,
	ok bool,
	err error,
)

func Default ¶

func Default[T any](dflt T) Chainable[T, T]

type Decoder ¶

type Decoder interface {
	DecodeQueryValues(url.Values) error
}

type Encoder ¶

type Encoder interface {
	EncodeQueryValues() (url.Values, error)
}

type ErrNotFound ¶

type ErrNotFound struct {
	Key string
}

func (*ErrNotFound) Error ¶

func (err *ErrNotFound) Error() string

type ErrQueryInvalid ¶

type ErrQueryInvalid struct {
	Inner error
}

func (*ErrQueryInvalid) Error ¶

func (err *ErrQueryInvalid) Error() string

func (*ErrQueryInvalid) Unwrap ¶

func (err *ErrQueryInvalid) Unwrap() error

type ErrValueInvalid ¶

type ErrValueInvalid struct {
	Path  string
	Value string
	Inner error
}

func (*ErrValueInvalid) Error ¶

func (err *ErrValueInvalid) Error() string

func (*ErrValueInvalid) Unwrap ¶

func (err *ErrValueInvalid) Unwrap() error

type Loader ¶

type Loader struct {
	Values url.Values
	Errs   []error
}

func NewLoader ¶

func NewLoader(values url.Values) *Loader

func (*Loader) AddErr ¶

func (loader *Loader) AddErr(err error) error

func (*Loader) Err ¶

func (loader *Loader) Err() error

func (*Loader) First ¶

func (loader *Loader) First(key string) (chain *Chain, v string, ok bool, err error)

func (*Loader) Get ¶

func (loader *Loader) Get(key string) (chain *Chain, v []string, ok bool, err error)

func (*Loader) Require ¶

func (loader *Loader) Require(key string) (chain *Chain, v []string, ok bool, err error)

func (*Loader) RequireFirst ¶

func (loader *Loader) RequireFirst(key string) (chain *Chain, v string, ok bool, err error)

Jump to

Keyboard shortcuts

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