diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 298a234..a186f27 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -26,20 +26,6 @@ jobs: - name: Test run: go test -v -race -covermode atomic -coverprofile=profile.cov ./... - - name: Build structargs - working-directory: ./sq/structargs - run: go build -v ./... - - name: Test structargs - working-directory: ./sq/structargs - run: go test -v ./... - - - name: Build reflectxargs - working-directory: ./sq/reflectxargs - run: go build -v ./... - - name: Test reflectxargs - working-directory: ./sq/reflectxargs - run: go test -v ./... - - name: Upload coverage uses: shogo82148/actions-goveralls@v1 with: diff --git a/README.md b/README.md index 223ea55..f3705be 100644 --- a/README.md +++ b/README.md @@ -88,12 +88,6 @@ library heavily discourages. * [MySQL](https://pkg.go.dev/github.com/rrgmc/litsql/dialect/mysql) * [SQLite](https://pkg.go.dev/github.com/rrgmc/litsql/dialect/sqlite) - -## Sub-packages - - * [structargs](https://pkg.go.dev/github.com/rrgmc/litsql/sq/structargs): get named arguments from struct fields - * [reflectxargs](https://pkg.go.dev/github.com/rrgmc/litsql/sq/reflectxargs): get named arguments from struct fields using reflectx - ## Examples ```go diff --git a/Taskfile.yml b/Taskfile.yml index 8d1aae7..e7d8a0a 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,12 +1,6 @@ version: '3' tasks: - update-version: - cmds: - - 'cd sq/structargs; go mod edit -require=github.com/rrgmc/litsql@{{.VERSION}}' - - 'cd sq/reflectxargs; go mod edit -require=github.com/rrgmc/litsql@{{.VERSION}}' - requires: - vars: [VERSION] current-version: cmds: - 'echo "Version: {{.GIT_TAG_CURRENT}}"' @@ -31,8 +25,6 @@ tasks: internal: true prompt: "Creating and pushing tag {{.VERSION}}. Are you sure?" cmds: - - 'git tag sq/structargs/{{.VERSION}}' - - 'git tag sq/reflectxargs/{{.VERSION}}' - 'git tag {{.VERSION}}' - 'git push --tags' requires: diff --git a/sq/reflectxargs/README.md b/sq/reflectxargs/README.md deleted file mode 100644 index 035f737..0000000 --- a/sq/reflectxargs/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# reflectxargs - get named arguments from struct fields using reflectxargs for litsql - -Get named arguments from struct fields for [litsql](https://github.com/rrgmc/litsql). - -## Author - -Rangel Reale (rangelreale@gmail.com) diff --git a/sq/reflectxargs/go.mod b/sq/reflectxargs/go.mod deleted file mode 100644 index 2a20499..0000000 --- a/sq/reflectxargs/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/rrgmc/litsql/sq/reflectxargs - -go 1.22.0 - -require ( - github.com/iancoleman/strcase v0.3.0 - github.com/jmoiron/sqlx v1.4.0 - github.com/rrgmc/litsql v0.8.1 - gotest.tools/v3 v3.5.1 -) - -require github.com/google/go-cmp v0.5.9 // indirect - -replace github.com/rrgmc/litsql => ../.. diff --git a/sq/reflectxargs/go.sum b/sq/reflectxargs/go.sum deleted file mode 100644 index 10fa4ef..0000000 --- a/sq/reflectxargs/go.sum +++ /dev/null @@ -1,12 +0,0 @@ -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= -github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/sq/reflectxargs/parseargs.go b/sq/reflectxargs/parseargs.go deleted file mode 100644 index 2463ccb..0000000 --- a/sq/reflectxargs/parseargs.go +++ /dev/null @@ -1,13 +0,0 @@ -package reflectxargs - -import ( - "github.com/rrgmc/litsql" - "github.com/rrgmc/litsql/sq" -) - -// WithGetArgsValuesOption adds a [litsql.ArgValues] to be parsed by [sq.ParseArgs]. -func WithGetArgsValuesOption(options ...Option) sq.GetArgValuesInstanceOption { - return sq.WithGetArgValuesInstanceOptionCustom(func(values any) (litsql.ArgValues, error) { - return New(values, options...), nil - }) -} diff --git a/sq/reflectxargs/reflectxargs.go b/sq/reflectxargs/reflectxargs.go deleted file mode 100644 index 145bedb..0000000 --- a/sq/reflectxargs/reflectxargs.go +++ /dev/null @@ -1,88 +0,0 @@ -package reflectxargs - -import ( - "reflect" - - "github.com/iancoleman/strcase" - "github.com/jmoiron/sqlx/reflectx" - "github.com/rrgmc/litsql" -) - -// New returns a [litsql.ArgValues] from struct fields. If value is not a struct, returns nil. -func New(value any, options ...Option) litsql.ArgValues { - v := getReflectValue(value) - if !v.IsValid() { - return nil - } - optns := argValuesOptions{ - tagName: "json", - } - for _, opt := range options { - opt(&optns) - } - if optns.mapper == nil { - if optns.mapperFunc == nil { - optns.mapperFunc = strcase.ToSnake - } - optns.mapper = reflectx.NewMapperFunc(optns.tagName, optns.mapperFunc) - } - return newFromMapper(v, optns.mapper) -} - -// NewFromMapper returns a [litsql.ArgValues] from struct fields. If value is not a struct, returns nil. -func NewFromMapper(value any, mapper *reflectx.Mapper) litsql.ArgValues { - v := getReflectValue(value) - if !v.IsValid() { - return nil - } - return newFromMapper(v, mapper) -} - -func newFromMapper(value reflect.Value, mapper *reflectx.Mapper) litsql.ArgValues { - return &argValues{ - sm: mapper.TypeMap(value.Type()), - value: value, - } -} - -type argValues struct { - sm *reflectx.StructMap - value reflect.Value -} - -func (s *argValues) Get(name string) (any, bool) { - f, ok := s.sm.Names[name] - if !ok { - return nil, false - } - return reflectx.FieldByIndexes(s.value, f.Index).Interface(), true -} - -type Option func(*argValuesOptions) - -type argValuesOptions struct { - mapper *reflectx.Mapper - tagName string - mapperFunc func(string) string -} - -// WithTagName sets the struct tag name to use. Default is "json". -func WithTagName(tagName string) Option { - return func(o *argValuesOptions) { - o.tagName = tagName - } -} - -// WithMapperFunc sets the field name mapper function. -func WithMapperFunc(mapperFunc func(string) string) Option { - return func(o *argValuesOptions) { - o.mapperFunc = mapperFunc - } -} - -// WithMapper sets the [reflectx.Mapper] instance. If set, the other options will be ignored -func WithMapper(mapper *reflectx.Mapper) Option { - return func(o *argValuesOptions) { - o.mapper = mapper - } -} diff --git a/sq/reflectxargs/reflectxargs_test.go b/sq/reflectxargs/reflectxargs_test.go deleted file mode 100644 index 326dcc6..0000000 --- a/sq/reflectxargs/reflectxargs_test.go +++ /dev/null @@ -1,62 +0,0 @@ -package reflectxargs - -import ( - "testing" - - "github.com/rrgmc/litsql/dialect/psql" - "github.com/rrgmc/litsql/dialect/psql/im" - "github.com/rrgmc/litsql/sq" - "gotest.tools/v3/assert" -) - -type sampleUser struct { - Id int `json:"id"` - Name string `json:"name"` -} - -func TestNew(t *testing.T) { - user := sampleUser{ - Id: 123, - Name: "John Doe", - } - - pargs := New(user) - assert.Assert(t, pargs != nil) - - query := psql.Insert( - im.Into("users", "id", "name"), - im.ValuesArgNamed("id", "name"), - ) - queryStr, args, err := query.Build( - sq.WithWriterOptions(sq.WithUseNewLine(false)), - sq.WithParseArgs(pargs), - ) - - assert.NilError(t, err) - assert.Equal(t, "INSERT INTO users (id, name) VALUES ($1, $2)", queryStr) - assert.DeepEqual(t, []any{123, "John Doe"}, args) -} - -func TestNewGetter(t *testing.T) { - user := sampleUser{ - Id: 123, - Name: "John Doe", - } - - pargs := New(user) - assert.Assert(t, pargs != nil) - - query := psql.Insert( - im.Into("users", "id", "name"), - im.ValuesArgNamed("id", "name"), - ) - queryStr, args, err := query.Build( - sq.WithWriterOptions(sq.WithUseNewLine(false)), - sq.WithGetArgValuesInstanceOptions(WithGetArgsValuesOption()), - sq.WithParseArgs(pargs), - ) - - assert.NilError(t, err) - assert.Equal(t, "INSERT INTO users (id, name) VALUES ($1, $2)", queryStr) - assert.DeepEqual(t, []any{123, "John Doe"}, args) -} diff --git a/sq/reflectxargs/util.go b/sq/reflectxargs/util.go deleted file mode 100644 index 7a52652..0000000 --- a/sq/reflectxargs/util.go +++ /dev/null @@ -1,12 +0,0 @@ -package reflectxargs - -import "reflect" - -func getReflectValue(value any) reflect.Value { - v := reflect.ValueOf(value) - v = reflect.Indirect(v) - if k := v.Kind(); k != reflect.Struct { - return reflect.Value{} - } - return v -} diff --git a/sq/structargs/README.md b/sq/structargs/README.md deleted file mode 100644 index 98c3b13..0000000 --- a/sq/structargs/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# structargs - get named arguments from struct fields for litsql - -[![Go Reference](https://pkg.go.dev/badge/github.com/rrgmc/litsql/sq/structargs.svg)](https://pkg.go.dev/github.com/rrgmc/litsql/sq/structargs) ![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/rrgmc/litsql) - -Get named arguments from struct fields for [litsql](https://github.com/rrgmc/litsql). - -## Author - -Rangel Reale (rangelreale@gmail.com) diff --git a/sq/structargs/go.mod b/sq/structargs/go.mod deleted file mode 100644 index 0814db8..0000000 --- a/sq/structargs/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module github.com/rrgmc/litsql/sq/structargs - -go 1.22.0 - -require ( - github.com/mitchellh/mapstructure v1.5.0 - github.com/rrgmc/litsql v0.8.1 - gotest.tools/v3 v3.5.1 -) - -require github.com/google/go-cmp v0.5.9 // indirect - -replace github.com/rrgmc/litsql => ../.. diff --git a/sq/structargs/go.sum b/sq/structargs/go.sum deleted file mode 100644 index 37e8c2d..0000000 --- a/sq/structargs/go.sum +++ /dev/null @@ -1,6 +0,0 @@ -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/sq/structargs/parseargs.go b/sq/structargs/parseargs.go deleted file mode 100644 index 39f6aaf..0000000 --- a/sq/structargs/parseargs.go +++ /dev/null @@ -1,13 +0,0 @@ -package structargs - -import ( - "github.com/rrgmc/litsql" - "github.com/rrgmc/litsql/sq" -) - -// WithGetArgsValuesOption adds ArgValues to be parsed by [sq.ParseArgs]. -func WithGetArgsValuesOption(options ...Option) sq.GetArgValuesInstanceOption { - return sq.WithGetArgValuesInstanceOptionCustom(func(values any) (litsql.ArgValues, error) { - return New(values, options...) - }) -} diff --git a/sq/structargs/structargs.go b/sq/structargs/structargs.go deleted file mode 100644 index 4a00af2..0000000 --- a/sq/structargs/structargs.go +++ /dev/null @@ -1,50 +0,0 @@ -package structargs - -import ( - "github.com/mitchellh/mapstructure" - "github.com/rrgmc/litsql" -) - -// New returns a [litsql.ArgValues] from struct fields. -func New(v any, options ...Option) (litsql.ArgValues, error) { - optns := argValuesOptions{ - tagName: "json", - } - for _, opt := range options { - opt(&optns) - } - return NewFromConfig(&mapstructure.DecoderConfig{ - TagName: optns.tagName, - }, v) -} - -// NewFromConfig returns a [litsql.ArgValues] from struct fields using a [mapstructure.DecoderConfig]. -func NewFromConfig(config *mapstructure.DecoderConfig, v any) (litsql.ArgValues, error) { - result := map[string]any{} - config.Result = &result - - dec, err := mapstructure.NewDecoder(config) - if err != nil { - return nil, err - } - - err = dec.Decode(v) - if err != nil { - return nil, err - } - - return litsql.MapArgValues(result), nil -} - -type Option func(*argValuesOptions) - -type argValuesOptions struct { - tagName string -} - -// WithTagName sets the struct tag name to use. Default is "json". -func WithTagName(tagName string) Option { - return func(o *argValuesOptions) { - o.tagName = tagName - } -} diff --git a/sq/structargs/structargs_test.go b/sq/structargs/structargs_test.go deleted file mode 100644 index f986afa..0000000 --- a/sq/structargs/structargs_test.go +++ /dev/null @@ -1,62 +0,0 @@ -package structargs - -import ( - "testing" - - "github.com/rrgmc/litsql/dialect/psql" - "github.com/rrgmc/litsql/dialect/psql/im" - "github.com/rrgmc/litsql/sq" - "gotest.tools/v3/assert" -) - -type sampleUser struct { - Id int `json:"id"` - Name string `json:"name"` -} - -func TestNew(t *testing.T) { - user := sampleUser{ - Id: 123, - Name: "John Doe", - } - - pargs, err := New(user) - assert.NilError(t, err) - - query := psql.Insert( - im.Into("users", "id", "name"), - im.ValuesArgNamed("id", "name"), - ) - queryStr, args, err := query.Build( - sq.WithWriterOptions(sq.WithUseNewLine(false)), - sq.WithParseArgs(pargs), - ) - - assert.NilError(t, err) - assert.Equal(t, "INSERT INTO users (id, name) VALUES ($1, $2)", queryStr) - assert.DeepEqual(t, []any{123, "John Doe"}, args) -} - -func TestNewSetter(t *testing.T) { - user := sampleUser{ - Id: 123, - Name: "John Doe", - } - - pargs, err := New(user) - assert.NilError(t, err) - - query := psql.Insert( - im.Into("users", "id", "name"), - im.ValuesArgNamed("id", "name"), - ) - queryStr, args, err := query.Build( - sq.WithWriterOptions(sq.WithUseNewLine(false)), - sq.WithGetArgValuesInstanceOptions(WithGetArgsValuesOption()), - sq.WithParseArgs(pargs), - ) - - assert.NilError(t, err) - assert.Equal(t, "INSERT INTO users (id, name) VALUES ($1, $2)", queryStr) - assert.DeepEqual(t, []any{123, "John Doe"}, args) -}