blockchain/internal/lib/cassandra/utils.go

69 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cassandra
import (
"log"
"reflect"
"unicode"
)
// GetCqlTag 取得指定欄位的 cql tag
// model 必須為 struct 指標fieldPtr 為該 struct 欄位的指標
func GetCqlTag(model interface{}, fieldPtr interface{}) string {
v := reflect.ValueOf(model)
// 確保 model 為 struct 指標
if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct {
log.Printf("should be a pointer to struct")
return ""
}
s := v.Elem()
// 遍歷所有欄位,找出地址與傳入 fieldPtr 相符的欄位
for i := 0; i < s.NumField(); i++ {
field := s.Type().Field(i)
fieldVal := s.Field(i)
// 如果能取地址且地址與 fieldPtr 相等,則取得 tag
if fieldVal.CanAddr() && fieldVal.Addr().Interface() == fieldPtr {
return field.Tag.Get("db")
}
}
return ""
}
// toSnakeCase 將 CamelCase 字串轉換為 snake_case
func toSnakeCase(s string) string {
var result []rune
for i, r := range s {
if unicode.IsUpper(r) {
if i > 0 {
result = append(result, '_')
}
result = append(result, unicode.ToLower(r))
} else {
result = append(result, r)
}
}
return string(result)
}
// 判斷欄位是否為零值或 nil
func isZero(v reflect.Value) bool {
switch v.Kind() {
case reflect.Ptr, reflect.Interface, reflect.Map, reflect.Slice:
return v.IsNil()
default:
return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface())
}
}
// 判斷字串是否存在於 slice 中
func contains(list []string, target string) bool {
for _, item := range list {
if item == target {
return true
}
}
return false
}