fix: handle MAL API returning numbers instead of strings for zero-value statistics

The MyAnimeList API inconsistently returns statistics status fields (watching,
completed, on_hold, dropped, plan_to_watch) as quoted strings for non-zero
values (e.g. "8217") but as bare numbers for zero values (e.g. 0). This caused
JSON unmarshal errors for anime with zero counts in any status field.

Introduce a FlexString custom type that implements json.Unmarshaler to accept
both JSON strings and JSON numbers, always storing the result as a string. The
type definition lives in MALTypes.go and the unmarshal logic in MALFunctions.go
to keep static types and behavior separate.
This commit is contained in:
2026-05-27 17:28:54 -04:00
parent 7f92b1714e
commit 3621b66437
2 changed files with 25 additions and 6 deletions

View File

@@ -1,6 +1,10 @@
package main
import "time"
import (
"time"
)
type FlexString string
type MyAnimeListJWT struct {
TokenType string `json:"token_type"`
@@ -129,11 +133,11 @@ type MALAnime struct {
Statistics struct {
NumListUsers int `json:"num_list_users" ts_type:"numListUsers"`
Status struct {
Watching string `json:"watching" ts_type:"watching"`
Completed string `json:"completed" ts_type:"completed"`
OnHold string `json:"on_hold" ts_type:"onHold"`
Dropped string `json:"dropped" ts_type:"dropped"`
PlanToWatch string `json:"plan_to_watch" ts_type:"planToWatch"`
Watching FlexString `json:"watching" ts_type:"string"`
Completed FlexString `json:"completed" ts_type:"string"`
OnHold FlexString `json:"on_hold" ts_type:"string"`
Dropped FlexString `json:"dropped" ts_type:"string"`
PlanToWatch FlexString `json:"plan_to_watch" ts_type:"string"`
}
}
}