]> git.lizzy.rs Git - go-anidb.git/commitdiff
anidb: Use a map instead of various fields that have to be switched
authorDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Fri, 26 Jul 2013 02:39:52 +0000 (23:39 -0300)
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Fri, 26 Jul 2013 02:39:52 +0000 (23:39 -0300)
Yet another map for which we have to write a MarshalJSON method...

mylistanime.go
mylistanimecache.go

index 3dc407b2e33d1501c39279a2ed58ab5dff200c77..8a6fdf48b5f4d605eee972bbc1829f9e7bbb5468 100644 (file)
@@ -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
+}
index c760bf33e866d59cff4d1d858e6d93a922e98afe..2ea83254ae0e07a2d2e351e19dd340a2c3f446a0 100644 (file)
@@ -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]),