queryx: make bindStructArgs and bindMapArgs as methods
This commit is contained in:
committed by
Michal Jan Matczuk
parent
7689c7267b
commit
5e98fb6f71
22
queryx.go
22
queryx.go
@@ -110,7 +110,7 @@ func Query(q *gocql.Query, names []string) *Queryx {
|
|||||||
// BindStruct binds query named parameters to values from arg using mapper. If
|
// BindStruct binds query named parameters to values from arg using mapper. If
|
||||||
// value cannot be found error is reported.
|
// value cannot be found error is reported.
|
||||||
func (q *Queryx) BindStruct(arg interface{}) *Queryx {
|
func (q *Queryx) BindStruct(arg interface{}) *Queryx {
|
||||||
arglist, err := bindStructArgs(q.Names, arg, nil, q.Mapper)
|
arglist, err := q.bindStructArgs(arg, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
q.err = fmt.Errorf("bind error: %s", err)
|
q.err = fmt.Errorf("bind error: %s", err)
|
||||||
} else {
|
} else {
|
||||||
@@ -125,7 +125,7 @@ func (q *Queryx) BindStruct(arg interface{}) *Queryx {
|
|||||||
// using a mapper. If value cannot be found in arg0 it's looked up in arg1
|
// using a mapper. If value cannot be found in arg0 it's looked up in arg1
|
||||||
// before reporting an error.
|
// before reporting an error.
|
||||||
func (q *Queryx) BindStructMap(arg0 interface{}, arg1 map[string]interface{}) *Queryx {
|
func (q *Queryx) BindStructMap(arg0 interface{}, arg1 map[string]interface{}) *Queryx {
|
||||||
arglist, err := bindStructArgs(q.Names, arg0, arg1, q.Mapper)
|
arglist, err := q.bindStructArgs(arg0, arg1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
q.err = fmt.Errorf("bind error: %s", err)
|
q.err = fmt.Errorf("bind error: %s", err)
|
||||||
} else {
|
} else {
|
||||||
@@ -136,8 +136,8 @@ func (q *Queryx) BindStructMap(arg0 interface{}, arg1 map[string]interface{}) *Q
|
|||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
func bindStructArgs(names []string, arg0 interface{}, arg1 map[string]interface{}, m *reflectx.Mapper) ([]interface{}, error) {
|
func (q *Queryx) bindStructArgs(arg0 interface{}, arg1 map[string]interface{}) ([]interface{}, error) {
|
||||||
arglist := make([]interface{}, 0, len(names))
|
arglist := make([]interface{}, 0, len(q.Names))
|
||||||
|
|
||||||
// grab the indirected value of arg
|
// grab the indirected value of arg
|
||||||
v := reflect.ValueOf(arg0)
|
v := reflect.ValueOf(arg0)
|
||||||
@@ -145,14 +145,14 @@ func bindStructArgs(names []string, arg0 interface{}, arg1 map[string]interface{
|
|||||||
v = v.Elem()
|
v = v.Elem()
|
||||||
}
|
}
|
||||||
|
|
||||||
err := m.TraversalsByNameFunc(v.Type(), names, func(i int, t []int) error {
|
err := q.Mapper.TraversalsByNameFunc(v.Type(), q.Names, func(i int, t []int) error {
|
||||||
if len(t) != 0 {
|
if len(t) != 0 {
|
||||||
val := reflectx.FieldByIndexesReadOnly(v, t) // nolint:scopelint
|
val := reflectx.FieldByIndexesReadOnly(v, t) // nolint:scopelint
|
||||||
arglist = append(arglist, val.Interface())
|
arglist = append(arglist, val.Interface())
|
||||||
} else {
|
} else {
|
||||||
val, ok := arg1[names[i]]
|
val, ok := arg1[q.Names[i]]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("could not find name %q in %#v and %#v", names[i], arg0, arg1)
|
return fmt.Errorf("could not find name %q in %#v and %#v", q.Names[i], arg0, arg1)
|
||||||
}
|
}
|
||||||
arglist = append(arglist, val)
|
arglist = append(arglist, val)
|
||||||
}
|
}
|
||||||
@@ -165,7 +165,7 @@ func bindStructArgs(names []string, arg0 interface{}, arg1 map[string]interface{
|
|||||||
|
|
||||||
// BindMap binds query named parameters using map.
|
// BindMap binds query named parameters using map.
|
||||||
func (q *Queryx) BindMap(arg map[string]interface{}) *Queryx {
|
func (q *Queryx) BindMap(arg map[string]interface{}) *Queryx {
|
||||||
arglist, err := bindMapArgs(q.Names, arg)
|
arglist, err := q.bindMapArgs(arg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
q.err = fmt.Errorf("bind error: %s", err)
|
q.err = fmt.Errorf("bind error: %s", err)
|
||||||
} else {
|
} else {
|
||||||
@@ -176,10 +176,10 @@ func (q *Queryx) BindMap(arg map[string]interface{}) *Queryx {
|
|||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
func bindMapArgs(names []string, arg map[string]interface{}) ([]interface{}, error) {
|
func (q *Queryx) bindMapArgs(arg map[string]interface{}) ([]interface{}, error) {
|
||||||
arglist := make([]interface{}, 0, len(names))
|
arglist := make([]interface{}, 0, len(q.Names))
|
||||||
|
|
||||||
for _, name := range names {
|
for _, name := range q.Names {
|
||||||
val, ok := arg[name]
|
val, ok := arg[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
return arglist, fmt.Errorf("could not find name %q in %#v", name, arg)
|
return arglist, fmt.Errorf("could not find name %q in %#v", name, arg)
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ func TestQueryxBindStruct(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("simple", func(t *testing.T) {
|
t.Run("simple", func(t *testing.T) {
|
||||||
names := []string{"name", "age", "first", "last"}
|
names := []string{"name", "age", "first", "last"}
|
||||||
args, err := bindStructArgs(names, v, nil, DefaultMapper)
|
args, err := Query(nil, names).bindStructArgs(v, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -90,7 +90,7 @@ func TestQueryxBindStruct(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("error", func(t *testing.T) {
|
t.Run("error", func(t *testing.T) {
|
||||||
names := []string{"name", "age", "first", "not_found"}
|
names := []string{"name", "age", "first", "not_found"}
|
||||||
_, err := bindStructArgs(names, v, nil, DefaultMapper)
|
_, err := Query(nil, names).bindStructArgs(v, nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("unexpected error")
|
t.Fatal("unexpected error")
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ func TestQueryxBindStruct(t *testing.T) {
|
|||||||
m := map[string]interface{}{
|
m := map[string]interface{}{
|
||||||
"not_found": "last",
|
"not_found": "last",
|
||||||
}
|
}
|
||||||
args, err := bindStructArgs(names, v, m, DefaultMapper)
|
args, err := Query(nil, names).bindStructArgs(v, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ func TestQueryxBindStruct(t *testing.T) {
|
|||||||
m := map[string]interface{}{
|
m := map[string]interface{}{
|
||||||
"not_found": "last",
|
"not_found": "last",
|
||||||
}
|
}
|
||||||
_, err := bindStructArgs(names, v, m, DefaultMapper)
|
_, err := Query(nil, names).bindStructArgs(v, m)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("unexpected error")
|
t.Fatal("unexpected error")
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ func TestQueryxBindMap(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("simple", func(t *testing.T) {
|
t.Run("simple", func(t *testing.T) {
|
||||||
names := []string{"name", "age", "first", "last"}
|
names := []string{"name", "age", "first", "last"}
|
||||||
args, err := bindMapArgs(names, v)
|
args, err := Query(nil, names).bindMapArgs(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -145,7 +145,7 @@ func TestQueryxBindMap(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("error", func(t *testing.T) {
|
t.Run("error", func(t *testing.T) {
|
||||||
names := []string{"name", "first", "not_found"}
|
names := []string{"name", "first", "not_found"}
|
||||||
_, err := bindMapArgs(names, v)
|
_, err := Query(nil, names).bindMapArgs(v)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("unexpected error")
|
t.Fatal("unexpected error")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user