summaryrefslogtreecommitdiff
path: root/vendor/github.com/uptrace/bun/schema/append.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/uptrace/bun/schema/append.go')
-rw-r--r--vendor/github.com/uptrace/bun/schema/append.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/vendor/github.com/uptrace/bun/schema/append.go b/vendor/github.com/uptrace/bun/schema/append.go
index d19f40d50..04538c036 100644
--- a/vendor/github.com/uptrace/bun/schema/append.go
+++ b/vendor/github.com/uptrace/bun/schema/append.go
@@ -1,6 +1,7 @@
package schema
import (
+ "fmt"
"reflect"
"strconv"
"time"
@@ -47,3 +48,54 @@ func Append(fmter Formatter, b []byte, v interface{}) []byte {
return appender(fmter, b, vv)
}
}
+
+//------------------------------------------------------------------------------
+
+func In(slice interface{}) QueryAppender {
+ v := reflect.ValueOf(slice)
+ if v.Kind() != reflect.Slice {
+ return &inValues{
+ err: fmt.Errorf("bun: In(non-slice %T)", slice),
+ }
+ }
+ return &inValues{
+ slice: v,
+ }
+}
+
+type inValues struct {
+ slice reflect.Value
+ err error
+}
+
+var _ QueryAppender = (*inValues)(nil)
+
+func (in *inValues) AppendQuery(fmter Formatter, b []byte) (_ []byte, err error) {
+ if in.err != nil {
+ return nil, in.err
+ }
+ return appendIn(fmter, b, in.slice), nil
+}
+
+func appendIn(fmter Formatter, b []byte, slice reflect.Value) []byte {
+ sliceLen := slice.Len()
+ for i := 0; i < sliceLen; i++ {
+ if i > 0 {
+ b = append(b, ", "...)
+ }
+
+ elem := slice.Index(i)
+ if elem.Kind() == reflect.Interface {
+ elem = elem.Elem()
+ }
+
+ if elem.Kind() == reflect.Slice && elem.Type() != bytesType {
+ b = append(b, '(')
+ b = appendIn(fmter, b, elem)
+ b = append(b, ')')
+ } else {
+ b = fmter.AppendValue(b, elem)
+ }
+ }
+ return b
+}