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) } }