refactor(health): improve health status JSON unmarshalling

This commit is contained in:
yusing
2025-09-29 17:52:03 +08:00
parent f411e17d80
commit 45b16abd68

View File

@@ -88,23 +88,38 @@ const (
StatusUnhealthy StatusUnhealthy
StatusError StatusError
StatusUnknownStr = "unknown"
StatusHealthyStr = "healthy"
StatusNappingStr = "napping"
StatusStartingStr = "starting"
StatusUnhealthyStr = "unhealthy"
StatusErrorStr = "error"
NumStatuses int = iota - 1 NumStatuses int = iota - 1
HealthyMask = StatusHealthy | StatusNapping | StatusStarting HealthyMask = StatusHealthy | StatusNapping | StatusStarting
IdlingMask = StatusNapping | StatusStarting IdlingMask = StatusNapping | StatusStarting
) )
var (
StatusHealthyStr2 = strconv.Itoa(int(StatusHealthy))
StatusNappingStr2 = strconv.Itoa(int(StatusNapping))
StatusStartingStr2 = strconv.Itoa(int(StatusStarting))
StatusUnhealthyStr2 = strconv.Itoa(int(StatusUnhealthy))
StatusErrorStr2 = strconv.Itoa(int(StatusError))
)
func NewHealthStatusFromString(s string) HealthStatus { func NewHealthStatusFromString(s string) HealthStatus {
switch s { switch s {
case "healthy": case StatusHealthyStr, StatusHealthyStr2:
return StatusHealthy return StatusHealthy
case "unhealthy": case StatusUnhealthyStr, StatusUnhealthyStr2:
return StatusUnhealthy return StatusUnhealthy
case "napping": case StatusNappingStr, StatusNappingStr2:
return StatusNapping return StatusNapping
case "starting": case StatusStartingStr, StatusStartingStr2:
return StatusStarting return StatusStarting
case "error": case StatusErrorStr, StatusErrorStr2:
return StatusError return StatusError
default: default:
return StatusUnknown return StatusUnknown
@@ -114,17 +129,17 @@ func NewHealthStatusFromString(s string) HealthStatus {
func (s HealthStatus) String() string { func (s HealthStatus) String() string {
switch s { switch s {
case StatusHealthy: case StatusHealthy:
return "healthy" return StatusHealthyStr
case StatusUnhealthy: case StatusUnhealthy:
return "unhealthy" return StatusUnhealthyStr
case StatusNapping: case StatusNapping:
return "napping" return StatusNappingStr
case StatusStarting: case StatusStarting:
return "starting" return StatusStartingStr
case StatusError: case StatusError:
return "error" return StatusErrorStr
default: default:
return "unknown" return StatusUnknownStr
} }
} }
@@ -145,21 +160,13 @@ func (s HealthStatus) MarshalJSON() ([]byte, error) {
} }
func (s *HealthStatus) UnmarshalJSON(data []byte) error { func (s *HealthStatus) UnmarshalJSON(data []byte) error {
var v any var v string
if err := sonic.Unmarshal(data, &v); err != nil { if err := sonic.Unmarshal(data, &v); err != nil {
return err return fmt.Errorf("failed to unmarshal health status: %w", err)
} }
switch v := v.(type) {
case string: *s = NewHealthStatusFromString(v)
*s = NewHealthStatusFromString(v) return nil
return nil
case int:
if v > 0 && v < NumStatuses {
*s = HealthStatus(v)
return nil
}
}
return fmt.Errorf("invalid health status type %T of value %v", v, v)
} }
func (jsonRepr *HealthJSONRepr) MarshalJSON() ([]byte, error) { func (jsonRepr *HealthJSONRepr) MarshalJSON() ([]byte, error) {