daq

package module
v0.3.0 Latest Latest
Warning

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

Go to latest
Published: Jan 2, 2024 License: MIT Imports: 4 Imported by: 7

README

daq

DAta Queries: Access nested properties in Go data structures.

Go Reference

Documentation

Overview

Access nested properties in Go data structures with DAta Queries

Example
var data any
json.Unmarshal([]byte(`{
		"a": 3.1415,
		"bs": [1, 2, 3]
	}`), &data)

prop, _ := Get(data, "a") // Ignore error in example for brevity
fmt.Println(prop)

prop, err := Get(data, "b") // This will fail, no "b"
fmt.Println(prop, err)

x, err := AsFloat64(Get(data, "bs", 1)) // Type assertion (encoding/json uses float64 for numbers)
fmt.Println(x, err)

x, err = AsFloat64(Get(data, "bs", -1)) // Access backwards from end
fmt.Println(x, err)

x = Float64Or(-1)(Get(data, "bs", 3)) // Fallback to -1 if Get has error
fmt.Println(x)
Output:

3.1415
<nil> step 0 [b]: no field named 'b'
2 <nil>
3 <nil>
-1

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func AsBool

func AsBool(v any, err error) (bool, error)
Example
fmt.Println(AsBool(Get(true)))
fmt.Println(Val(AsBool, false)(Get(4711)))
Output:

true <nil>
false

func AsDuration

func AsDuration(v any, err error) (time.Duration, error)

func AsFloat32

func AsFloat32(v any, err error) (float32, error)

func AsFloat64

func AsFloat64(v any, err error) (float64, error)

func AsInt

func AsInt(v any, err error) (int, error)

func AsInt16

func AsInt16(v any, err error) (int16, error)

func AsInt32

func AsInt32(v any, err error) (int32, error)

func AsInt64

func AsInt64(v any, err error) (int64, error)

func AsInt8

func AsInt8(v any, err error) (int8, error)

func AsString

func AsString(v any, err error) (string, error)
Example
fmt.Println(Val(AsString, "-")(Map(testExample).Get("a")))
fmt.Println(Val(AsString, "-")(Get(testExample, "a", 0, "d")))
Output:

-
foo

func AsTime

func AsTime(v any, err error) (time.Time, error)

func AsUint

func AsUint(v any, err error) (uint, error)

func AsUint16

func AsUint16(v any, err error) (uint16, error)

func AsUint32

func AsUint32(v any, err error) (uint32, error)

func AsUint64

func AsUint64(v any, err error) (uint64, error)

func AsUint8

func AsUint8(v any, err error) (uint8, error)

func AsUintPtr

func AsUintPtr(v any, err error) (uintptr, error)

func BoolOr

func BoolOr(fallback bool) func(any, error) bool

func DurationOr

func DurationOr(fallback time.Duration) func(any, error) time.Duration

func Field

func Field(data any, name string) (any, error)

func Float32Or

func Float32Or(fallback float32) func(any, error) float32

func Float64Or

func Float64Or(fallback float64) func(any, error) float64

func Get

func Get(data any, path ...any) (res any, err error)

func Index

func Index(data any, i int) (any, error)

func Int16Or

func Int16Or(fallback int16) func(any, error) int16

func Int32Or

func Int32Or(fallback int32) func(any, error) int32

func Int64Or

func Int64Or(fallback int64) func(any, error) int64

func Int8Or

func Int8Or(fallback int8) func(any, error) int8

func IntOr

func IntOr(fallback int) func(any, error) int

func MapOr

func MapOr(fallback Map) func(any, error) Map

func SliceOr

func SliceOr(fallback Slice) func(any, error) Slice

func Step

func Step(data, step any) (any, error)

func StepEach added in v0.3.0

func StepEach(data any, do func(key, value any) error) error
Example (Array)
data := [4]any{0, '1', "two", nil}
err := StepEach(data, testStepEach)
fmt.Println(err)
Output:

k=0 / v=0
k=1 / v=49
k=2 / v="two"
k=3 / v=<nil>
<nil>
Example (Atom)
err := StepEach(5180, testStepEach)
fmt.Println(err)
Output:

<nil>
Example (Map)
data := map[any]any{
	false: "foo",
	7:     nil,
	"bar": 4711,
}
err := StepEach(data, testStepEach)
fmt.Println(err)
Output:

k=false / v="foo"
k=7 / v=<nil>
k="bar" / v=4711
<nil>
Example (Slice)
data := []any{0, '1', "two", nil}
err := StepEach(data, testStepEach)
fmt.Println(err)
Output:

k=0 / v=0
k=1 / v=49
k=2 / v="two"
k=3 / v=<nil>
<nil>
Example (Struct)
type Tstnest struct {
	Foo int
}
data := struct {
	Tstnest
	Bar  string
	Nest Tstnest
}{
	Tstnest: Tstnest{Foo: 4711},
	Bar:     "baz",
	Nest:    Tstnest{Foo: -1},
}
err := StepEach(data, testStepEach)
fmt.Println(err)
Output:

k="Foo" / v=4711
k="Bar" / v="baz"
k="Nest" / v=daq.Tstnest{Foo:-1}
<nil>

func StringOr

func StringOr(fallback string) func(any, error) string

func TimeOr

func TimeOr(fallback time.Time) func(any, error) time.Time

func Uint16Or

func Uint16Or(fallback uint16) func(any, error) uint16

func Uint32Or

func Uint32Or(fallback uint32) func(any, error) uint32

func Uint64Or

func Uint64Or(fallback uint64) func(any, error) uint64

func Uint8Or

func Uint8Or(fallback uint8) func(any, error) uint8

func UintOr

func UintOr(fallback uint) func(any, error) uint

func UintPtrOr

func UintPtrOr(fallback uintptr) func(any, error) uintptr

func Val

func Val[T any](assert func(any, error) (T, error), fallback T) func(v any, err error) T
Example
data := struct {
	Foo int
	Bar string
}{
	Foo: 4711,
	Bar: "baz",
}
fmt.Println(Val(AsString, "fallback1")(Get(data, "Foo")))
fmt.Println(Val(AsString, "fallback2")(Get(data, "Bar")))
fmt.Println(Val(AsString, "fallback3")(Get(data, "void")))
Output:

fallback1
baz
fallback3

Types

type Alt

type Alt struct {
	S        any
	Fallback any
}

func (Alt) Step

func (a Alt) Step(data any) (any, error)

type FirstNameOf

type FirstNameOf []string

func (FirstNameOf) Step

func (ns FirstNameOf) Step(data any) (res any, err error)

type FirstOf

type FirstOf []any

func (FirstOf) Step

func (keys FirstOf) Step(data any) (res any, err error)

type Map

type Map map[string]any

func AsMap

func AsMap(v any, err error) (Map, error)

func (Map) Get

func (m Map) Get(n string) (any, error)

type NoValue

type NoValue struct {
	ForStep any
}

func (NoValue) Error

func (e NoValue) Error() string

type Slice

type Slice []any

func AsSlice

func AsSlice(v any, err error) (Slice, error)
Example
for _, e := range Val(AsSlice, nil)(testExample.Get("a")) {
	fmt.Println(e)
}
Output:

map[b:map[c:3] d:foo]
false

func (Slice) Get

func (s Slice) Get(i int) (any, error)

type StepError

type StepError struct {
	N    int
	Step any
	Err  error
}

func (StepError) Error

func (e StepError) Error() string

func (StepError) Unwrap

func (e StepError) Unwrap() error

type Stepper

type Stepper interface {
	Step(data any) (any, error)
}

type Time

type Time string
Example
data := struct {
	Time string
}{
	Time: "2023-12-29T22:04:00Z",
}
fmt.Println(Val(Time(time.RFC3339).As, time.Time{})(Get(data, "Time")))
fmt.Println(Val(Time(time.RFC3339).As, time.Time{})(Get(data, "void")))
Output:

2023-12-29 22:04:00 +0000 UTC
0001-01-01 00:00:00 +0000 UTC

func (Time) As

func (t Time) As(v any, err error) (time.Time, error)

type Track

type Track []any

func GetTrack

func GetTrack(data any, path ...any) (t Track, err error)

func (Track) At

func (t Track) At(i int) any

Jump to

Keyboard shortcuts

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