summaryrefslogtreecommitdiffstats
path: root/vendor/xorm.io/xorm/convert/string.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/xorm.io/xorm/convert/string.go')
-rw-r--r--vendor/xorm.io/xorm/convert/string.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/vendor/xorm.io/xorm/convert/string.go b/vendor/xorm.io/xorm/convert/string.go
new file mode 100644
index 0000000000..de11fa01a3
--- /dev/null
+++ b/vendor/xorm.io/xorm/convert/string.go
@@ -0,0 +1,75 @@
+// Copyright 2021 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package convert
+
+import (
+ "database/sql"
+ "fmt"
+ "reflect"
+ "strconv"
+)
+
+// AsString converts interface as string
+func AsString(src interface{}) string {
+ switch v := src.(type) {
+ case string:
+ return v
+ case []byte:
+ return string(v)
+ case *sql.NullString:
+ return v.String
+ case *sql.NullInt32:
+ return fmt.Sprintf("%d", v.Int32)
+ case *sql.NullInt64:
+ return fmt.Sprintf("%d", v.Int64)
+ }
+ rv := reflect.ValueOf(src)
+ switch rv.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return strconv.FormatInt(rv.Int(), 10)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return strconv.FormatUint(rv.Uint(), 10)
+ case reflect.Float64:
+ return strconv.FormatFloat(rv.Float(), 'g', -1, 64)
+ case reflect.Float32:
+ return strconv.FormatFloat(rv.Float(), 'g', -1, 32)
+ case reflect.Bool:
+ return strconv.FormatBool(rv.Bool())
+ }
+ return fmt.Sprintf("%v", src)
+}
+
+// AsBytes converts interface as bytes
+func AsBytes(src interface{}) ([]byte, bool) {
+ switch t := src.(type) {
+ case []byte:
+ return t, true
+ case *sql.NullString:
+ if !t.Valid {
+ return nil, true
+ }
+ return []byte(t.String), true
+ case *sql.RawBytes:
+ return *t, true
+ }
+
+ rv := reflect.ValueOf(src)
+
+ switch rv.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return strconv.AppendInt(nil, rv.Int(), 10), true
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return strconv.AppendUint(nil, rv.Uint(), 10), true
+ case reflect.Float32:
+ return strconv.AppendFloat(nil, rv.Float(), 'g', -1, 32), true
+ case reflect.Float64:
+ return strconv.AppendFloat(nil, rv.Float(), 'g', -1, 64), true
+ case reflect.Bool:
+ return strconv.AppendBool(nil, rv.Bool()), true
+ case reflect.String:
+ return []byte(rv.String()), true
+ }
+ return nil, false
+}