132 lines
2.7 KiB
Go

package baishun
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
)
// defaultIfBlank 在字符串为空时返回默认值。
func defaultIfBlank(value, fallback string) string {
if strings.TrimSpace(value) != "" {
return value
}
return fallback
}
// pickFirstInt 从字符串中取第一个整数,失败时返回默认值。
func pickFirstInt(raw string, fallback int) int {
raw = strings.TrimSpace(raw)
if raw == "" {
return fallback
}
var list []int
if strings.HasPrefix(raw, "[") {
if json.Unmarshal([]byte(raw), &list) == nil && len(list) > 0 {
return list[len(list)-1]
}
}
if parsed, err := strconv.Atoi(raw); err == nil && parsed > 0 {
return parsed
}
return fallback
}
// receiptTypeFromDiff 根据金额正负映射钱包收支类型。
func receiptTypeFromDiff(diff int64) string {
if diff >= 0 {
return "INCOME"
}
return "EXPENDITURE"
}
// abs64 返回 int64 的绝对值。
func abs64(value int64) int64 {
if value < 0 {
return -value
}
return value
}
// isBizMessageTooLongError 判断是否是业务描述超长错误。
func isBizMessageTooLongError(err error) bool {
if err == nil {
return false
}
message := strings.ToLower(err.Error())
return strings.Contains(message, "data too long") && strings.Contains(message, "biz_message")
}
// truncateRunes 按 rune 长度截断字符串。
func truncateRunes(value string, limit int) string {
if limit <= 0 || value == "" {
return ""
}
runes := []rune(value)
if len(runes) <= limit {
return value
}
return string(runes[:limit])
}
// parseInt64Default 解析字符串整数,失败时返回 0。
func parseInt64Default(value string) int64 {
parsed, _ := strconv.ParseInt(strings.TrimSpace(value), 10, 64)
return parsed
}
// sanitizeRoomID 规范化房间 ID。
func sanitizeRoomID(roomID string) string {
roomID = strings.ReplaceAll(strings.TrimSpace(roomID), " ", "_")
if roomID == "" {
return "room"
}
return roomID
}
// intPtr 返回 int 指针。
func intPtr(value int) *int {
return &value
}
// derefInt 安全解引用 int 指针。
func derefInt(value *int) int {
if value == nil {
return 0
}
return *value
}
// derefTime 安全解引用时间指针。
func derefTime(value *time.Time) time.Time {
if value == nil {
return time.Unix(0, 0)
}
return *value
}
// stringPtr 返回 string 指针。
func stringPtr(value string) *string {
if strings.TrimSpace(value) == "" {
return nil
}
return &value
}
// toString 宽松地把任意值转换成字符串。
func toString(value any) string {
if value == nil {
return ""
}
switch typed := value.(type) {
case string:
return typed
case json.Number:
return typed.String()
default:
return fmt.Sprint(typed)
}
}