From 091a27e88ce7152a2dd783451ffba5b8a465cab5 Mon Sep 17 00:00:00 2001 From: "Diogo Franco (Kovensky)" Date: Thu, 25 Jul 2013 23:39:52 -0300 Subject: [PATCH] anidb: Use a map instead of various fields that have to be switched Yet another map for which we have to write a MarshalJSON method... --- mylistanime.go | 32 ++++++++++++++++++++++++++++---- mylistanimecache.go | 23 +++++++++-------------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/mylistanime.go b/mylistanime.go index 3dc407b..8a6fdf4 100644 --- a/mylistanime.go +++ b/mylistanime.go @@ -10,10 +10,7 @@ import ( type MyListAnime struct { AID AID - UnknownState misc.EpisodeList - OnHDD misc.EpisodeList - OnCD misc.EpisodeList - Deleted misc.EpisodeList + EpisodesWithState MyListStateMap WatchedEpisodes misc.EpisodeList @@ -48,3 +45,30 @@ func (ge GroupEpisodes) UnmarshalJSON(b []byte) error { return nil } + +type MyListStateMap map[MyListState]misc.EpisodeList + +func (sm MyListStateMap) MarshalJSON() ([]byte, error) { + generic := make(map[string]misc.EpisodeList, len(sm)) + for k, v := range sm { + generic[strconv.Itoa(int(k))] = v + } + return json.Marshal(generic) +} + +func (sm MyListStateMap) UnmarshalJSON(b []byte) error { + var generic map[string]misc.EpisodeList + if err := json.Unmarshal(b, &generic); err != nil { + return err + } + for k, v := range generic { + ik, err := strconv.ParseInt(k, 10, 32) + if err != nil { + return err + } + + sm[MyListState(ik)] = v + } + + return nil +} diff --git a/mylistanimecache.go b/mylistanimecache.go index c760bf3..2ea8325 100644 --- a/mylistanimecache.go +++ b/mylistanimecache.go @@ -77,22 +77,15 @@ func (adb *AniDB) MyListAnime(aid AID) <-chan *MyListAnime { ep := <-adb.EpisodeByID(r.EID) list := misc.EpisodeToList(&ep.Episode) - switch r.MyListState { - case MyListStateUnknown: - entry.UnknownState = list - case MyListStateHDD: - entry.OnHDD = list - case MyListStateCD: - entry.OnCD = list - case MyListStateDeleted: - entry.Deleted = list + entry.EpisodesWithState = MyListStateMap{ + r.MyListState: list, } if !r.DateWatched.IsZero() { entry.WatchedEpisodes = list } - entry.EpisodesPerGroup = map[GID]misc.EpisodeList{ + entry.EpisodesPerGroup = GroupEpisodes{ r.GID: list, } case 312: @@ -173,10 +166,12 @@ func (adb *AniDB) parseMylistAnime(reply udpapi.APIReply) *MyListAnime { } return &MyListAnime{ - UnknownState: misc.ParseEpisodeList(parts[2]), - OnHDD: misc.ParseEpisodeList(parts[3]), - OnCD: misc.ParseEpisodeList(parts[4]), - Deleted: misc.ParseEpisodeList(parts[5]), + EpisodesWithState: MyListStateMap{ + MyListStateUnknown: misc.ParseEpisodeList(parts[2]), + MyListStateHDD: misc.ParseEpisodeList(parts[3]), + MyListStateCD: misc.ParseEpisodeList(parts[4]), + MyListStateDeleted: misc.ParseEpisodeList(parts[5]), + }, WatchedEpisodes: misc.ParseEpisodeList(parts[6]), -- 2.44.0