structscan

package module
v0.0.18 Latest Latest
Warning

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

Go to latest
Published: Jul 22, 2025 License: MIT Imports: 12 Imported by: 2

README

structscan

go.dev reference GitHub tag (latest SemVer) Coverage

structscan maps SQL rows to Go structs.

go get -u github.com/go-sqlt/structscan

Example

package main

import (
	"database/sql"
	"fmt"

	"github.com/go-sqlt/structscan"
	_ "modernc.org/sqlite"
)

type Dest struct {
	Total int64
	Bool  bool
}

func main() {
	schema := structscan.New[Dest](
		structscan.Scan[Dest]().String().Enum(
			structscan.Enum{String: "2", Int: 2},
		).MustTo("Total"),
		structscan.Scan[Dest]().String().TrimSpace().ParseBool().MustTo("Bool"),
	)

	db, err := sql.Open("sqlite", ":memory:")
	if err != nil {
		panic(err)
	}

	rows, err := db.Query(`SELECT '2', '    true '`)
	if err != nil {
		panic(err)
	}

	defer rows.Close()

	data, err := schema.One(rows)
	if err != nil {
		panic(err)
	}

	fmt.Println(data) // {2 true}
}

Documentation

Overview

Package structscan is a lightweight Go library that maps SQL query results to Go structs.

package main

import (

"database/sql"
"fmt"

"github.com/go-sqlt/structscan"
_ "modernc.org/sqlite"

)

type Dest struct {
	Total int64
	Bool  bool
}
func main() {
	schema := structscan.New[Dest](
		structscan.Scan[Dest]().String().Enum(
			structscan.Enum{String: "2", Int: 2},
		).MustTo("Total"),
		structscan.Scan[Dest]().String().TrimSpace().ParseBool().MustTo("Bool"),
	)

	db, err := sql.Open("sqlite", ":memory:")
	if err != nil {
		panic(err)
	}

	rows, err := db.Query(`SELECT '2', '    true '`)
	if err != nil {
		panic(err)
	}

	defer rows.Close()

	data, err := schema.One(rows)
	if err != nil {
		panic(err)
	}

	fmt.Println(data) // {2 true}
}

Index

Constants

This section is empty.

Variables

View Source
var ErrTooManyRows = errors.New("too many rows")

Functions

This section is empty.

Types

type BinaryScanner added in v0.0.12

type BinaryScanner[S any] struct {
	// contains filtered or unexported fields
}

func (BinaryScanner[S]) MustTo added in v0.0.14

func (s BinaryScanner[S]) MustTo(path string) Scanner

func (BinaryScanner[S]) Scan added in v0.0.12

func (s BinaryScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (BinaryScanner[S]) To added in v0.0.14

func (s BinaryScanner[S]) To(path string) (Scanner, error)

type BoolScanner added in v0.0.12

type BoolScanner[S any] struct {
	// contains filtered or unexported fields
}

func (BoolScanner[S]) Format added in v0.0.12

func (s BoolScanner[S]) Format() StringScanner[S]

func (BoolScanner[S]) MustTo added in v0.0.14

func (s BoolScanner[S]) MustTo(path string) Scanner

func (BoolScanner[S]) Scan added in v0.0.12

func (s BoolScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (BoolScanner[S]) To added in v0.0.14

func (s BoolScanner[S]) To(path string) (Scanner, error)

type BytesScanner added in v0.0.12

type BytesScanner[S any] struct {
	// contains filtered or unexported fields
}

func (BytesScanner[S]) MustTo added in v0.0.14

func (s BytesScanner[S]) MustTo(path string) Scanner

func (BytesScanner[S]) Scan added in v0.0.12

func (s BytesScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (BytesScanner[S]) To added in v0.0.14

func (s BytesScanner[S]) To(path string) (Scanner, error)

type DefaultScanner added in v0.0.16

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

func Scan added in v0.0.5

func Scan[T any]() DefaultScanner

func (DefaultScanner) Binary added in v0.0.16

func (s DefaultScanner) Binary() BinaryScanner[[]byte]

func (DefaultScanner) Bool added in v0.0.16

func (s DefaultScanner) Bool() BoolScanner[bool]

func (DefaultScanner) Bytes added in v0.0.16

func (s DefaultScanner) Bytes() BytesScanner[[]byte]

func (DefaultScanner) Float added in v0.0.16

func (s DefaultScanner) Float() FloatScanner[float64]

func (DefaultScanner) Int added in v0.0.16

func (s DefaultScanner) Int() IntScanner[int64]

func (DefaultScanner) IntSlice added in v0.0.16

func (s DefaultScanner) IntSlice() IntSliceScanner[[]int64]

func (DefaultScanner) JSON added in v0.0.16

func (s DefaultScanner) JSON() JSONScanner[[]byte]

func (DefaultScanner) MustTo added in v0.0.18

func (s DefaultScanner) MustTo(path string) Scanner

func (DefaultScanner) Nullable added in v0.0.16

func (s DefaultScanner) Nullable() DefaultScanner

func (DefaultScanner) Scan added in v0.0.16

func (s DefaultScanner) Scan() (any, func(dst reflect.Value) error)

func (DefaultScanner) String added in v0.0.16

func (s DefaultScanner) String() StringScanner[string]

func (DefaultScanner) StringSlice added in v0.0.16

func (s DefaultScanner) StringSlice() StringSliceScanner[[]string]

func (DefaultScanner) Text added in v0.0.16

func (s DefaultScanner) Text() TextScanner[[]byte]

func (DefaultScanner) Time added in v0.0.16

func (s DefaultScanner) Time() TimeScanner[time.Time]

func (DefaultScanner) To added in v0.0.16

func (s DefaultScanner) To(path string) (Scanner, error)

func (DefaultScanner) Uint added in v0.0.16

func (s DefaultScanner) Uint() UintScanner[uint64]

type Enum added in v0.0.5

type Enum struct {
	String string
	Int    int64
}

type FloatScanner added in v0.0.12

type FloatScanner[S any] struct {
	// contains filtered or unexported fields
}

func (FloatScanner[S]) Format added in v0.0.12

func (s FloatScanner[S]) Format(fmt byte, prec int, bitSize int) StringScanner[S]

func (FloatScanner[S]) MustTo added in v0.0.14

func (s FloatScanner[S]) MustTo(path string) Scanner

func (FloatScanner[S]) Scan added in v0.0.12

func (s FloatScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (FloatScanner[S]) To added in v0.0.14

func (s FloatScanner[S]) To(path string) (Scanner, error)

type IntScanner added in v0.0.12

type IntScanner[S any] struct {
	// contains filtered or unexported fields
}

func (IntScanner[S]) Enum added in v0.0.12

func (s IntScanner[S]) Enum(enums ...Enum) StringScanner[S]

func (IntScanner[S]) Format added in v0.0.12

func (s IntScanner[S]) Format(base int) StringScanner[S]

func (IntScanner[S]) MustTo added in v0.0.14

func (s IntScanner[S]) MustTo(path string) Scanner

func (IntScanner[S]) Scan added in v0.0.12

func (s IntScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (IntScanner[S]) To added in v0.0.14

func (s IntScanner[S]) To(path string) (Scanner, error)

type IntSliceScanner added in v0.0.16

type IntSliceScanner[S any] struct {
	// contains filtered or unexported fields
}

func (IntSliceScanner[S]) Asc added in v0.0.16

func (s IntSliceScanner[S]) Asc() IntSliceScanner[S]

func (IntSliceScanner[S]) Desc added in v0.0.16

func (s IntSliceScanner[S]) Desc() IntSliceScanner[S]

func (IntSliceScanner[S]) Format added in v0.0.16

func (s IntSliceScanner[S]) Format(base int) StringSliceScanner[S]

func (IntSliceScanner[S]) MustTo added in v0.0.18

func (s IntSliceScanner[S]) MustTo(path string) Scanner

func (IntSliceScanner[S]) Scan added in v0.0.16

func (s IntSliceScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (IntSliceScanner[S]) To added in v0.0.16

func (s IntSliceScanner[S]) To(path string) (Scanner, error)

type JSONScanner added in v0.0.12

type JSONScanner[S any] struct {
	// contains filtered or unexported fields
}

func (JSONScanner[S]) MustTo added in v0.0.14

func (s JSONScanner[S]) MustTo(path string) Scanner

func (JSONScanner[S]) Scan added in v0.0.12

func (s JSONScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (JSONScanner[S]) To added in v0.0.14

func (s JSONScanner[S]) To(path string) (Scanner, error)

type Rows added in v0.0.16

type Rows interface {
	Next() bool
	Scan(dest ...any) error
	Err() error
}

type Runner added in v0.0.16

type Runner[T any] struct {
	Src []any
	Set []func(dst reflect.Value) error
}

func NewRunner added in v0.0.16

func NewRunner[T any](scanners ...Scanner) *Runner[T]

func (*Runner[T]) All added in v0.0.16

func (r *Runner[T]) All(rows Rows) ([]T, error)

func (*Runner[T]) First added in v0.0.16

func (r *Runner[T]) First(rows Rows) (T, error)

func (*Runner[T]) One added in v0.0.16

func (r *Runner[T]) One(rows Rows) (T, error)

type ScanFunc added in v0.0.3

type ScanFunc func() (any, func(dst reflect.Value) error)

func (ScanFunc) Scan added in v0.0.3

func (sf ScanFunc) Scan() (any, func(dst reflect.Value) error)

type Scanner

type Scanner interface {
	Scan() (any, func(dst reflect.Value) error)
}

type Schema added in v0.0.3

type Schema[T any] struct {
	// contains filtered or unexported fields
}

func New

func New[T any](scanners ...Scanner) *Schema[T]

func (*Schema[T]) All added in v0.0.16

func (s *Schema[T]) All(rows Rows) ([]T, error)

func (*Schema[T]) First added in v0.0.16

func (s *Schema[T]) First(rows Rows) (T, error)

func (*Schema[T]) GetRunner added in v0.0.16

func (s *Schema[T]) GetRunner() *Runner[T]

func (*Schema[T]) One added in v0.0.16

func (s *Schema[T]) One(rows Rows) (T, error)

func (*Schema[T]) PutRunner added in v0.0.16

func (s *Schema[T]) PutRunner(r *Runner[T])

type StringScanner added in v0.0.12

type StringScanner[S any] struct {
	// contains filtered or unexported fields
}

func (StringScanner[S]) Enum added in v0.0.12

func (s StringScanner[S]) Enum(enums ...Enum) IntScanner[S]

func (StringScanner[S]) MustTo added in v0.0.14

func (s StringScanner[S]) MustTo(path string) Scanner

func (StringScanner[S]) ParseBool added in v0.0.16

func (s StringScanner[S]) ParseBool() BoolScanner[S]

func (StringScanner[S]) ParseFloat added in v0.0.16

func (s StringScanner[S]) ParseFloat(bitSize int) FloatScanner[S]

func (StringScanner[S]) ParseInt added in v0.0.16

func (s StringScanner[S]) ParseInt(base int, bitSize int) IntScanner[S]

func (StringScanner[S]) ParseTime added in v0.0.16

func (s StringScanner[S]) ParseTime(layout string) TimeScanner[S]

func (StringScanner[S]) ParseTimeInLocation added in v0.0.16

func (s StringScanner[S]) ParseTimeInLocation(layout string, loc *time.Location) TimeScanner[S]

func (StringScanner[S]) ParseUint added in v0.0.16

func (s StringScanner[S]) ParseUint(base int, bitSize int) UintScanner[S]

func (StringScanner[S]) Scan added in v0.0.12

func (s StringScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (StringScanner[S]) Split added in v0.0.12

func (s StringScanner[S]) Split(sep string) StringSliceScanner[S]

func (StringScanner[S]) To added in v0.0.14

func (s StringScanner[S]) To(path string) (Scanner, error)

func (StringScanner[S]) Trim added in v0.0.12

func (s StringScanner[S]) Trim(cutset string) StringScanner[S]

func (StringScanner[S]) TrimPrefix added in v0.0.16

func (s StringScanner[S]) TrimPrefix(prefix string) StringScanner[S]

func (StringScanner[S]) TrimSpace added in v0.0.12

func (s StringScanner[S]) TrimSpace() StringScanner[S]

func (StringScanner[S]) TrimSuffix added in v0.0.16

func (s StringScanner[S]) TrimSuffix(suffix string) StringScanner[S]

type StringSliceScanner added in v0.0.12

type StringSliceScanner[S any] struct {
	// contains filtered or unexported fields
}

func (StringSliceScanner[S]) Asc added in v0.0.13

func (s StringSliceScanner[S]) Asc() StringSliceScanner[S]

func (StringSliceScanner[S]) Desc added in v0.0.13

func (s StringSliceScanner[S]) Desc() StringSliceScanner[S]

func (StringSliceScanner[S]) MustTo added in v0.0.14

func (s StringSliceScanner[S]) MustTo(path string) Scanner

func (StringSliceScanner[S]) ParseInt added in v0.0.16

func (s StringSliceScanner[S]) ParseInt(base int, bitSize int) IntSliceScanner[S]

func (StringSliceScanner[S]) Scan added in v0.0.12

func (s StringSliceScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (StringSliceScanner[S]) To added in v0.0.14

func (s StringSliceScanner[S]) To(path string) (Scanner, error)

type TextScanner added in v0.0.12

type TextScanner[S any] struct {
	// contains filtered or unexported fields
}

func (TextScanner[S]) MustTo added in v0.0.14

func (s TextScanner[S]) MustTo(path string) Scanner

func (TextScanner[S]) Scan added in v0.0.12

func (s TextScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (TextScanner[S]) To added in v0.0.14

func (s TextScanner[S]) To(path string) (Scanner, error)

type TimeScanner added in v0.0.12

type TimeScanner[S any] struct {
	// contains filtered or unexported fields
}

func (TimeScanner[S]) Format added in v0.0.12

func (s TimeScanner[S]) Format(layout string) StringScanner[S]

func (TimeScanner[S]) MustTo added in v0.0.14

func (s TimeScanner[S]) MustTo(path string) Scanner

func (TimeScanner[S]) Scan added in v0.0.12

func (s TimeScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (TimeScanner[S]) To added in v0.0.14

func (s TimeScanner[S]) To(path string) (Scanner, error)

type UintScanner added in v0.0.12

type UintScanner[S any] struct {
	// contains filtered or unexported fields
}

func (UintScanner[S]) Format added in v0.0.12

func (s UintScanner[S]) Format(base int) StringScanner[S]

func (UintScanner[S]) MustTo added in v0.0.14

func (s UintScanner[S]) MustTo(path string) Scanner

func (UintScanner[S]) Scan added in v0.0.12

func (s UintScanner[S]) Scan() (any, func(dst reflect.Value) error)

func (UintScanner[S]) To added in v0.0.14

func (s UintScanner[S]) To(path string) (Scanner, error)

Jump to

Keyboard shortcuts

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