diff --git a/client.go b/client.go index 2fd8e9347ef052c6dd2679a6de8ed19da25ef54f..22075e092df7340229d7a6d185d64659750efea5 100644 --- a/client.go +++ b/client.go @@ -22,21 +22,35 @@ type ApiClient struct { const cacheTimestamp = "2006-01-02T15:04" -func (c *ApiClient) Station(evaId int64) ([]Station, error) { - key := fmt.Sprintf("realtime_recent %d", evaId) - - var result []Station +func (c *ApiClient) loadWithCache(key string, result interface{}, load func(interface{}) error) error { for _, cache := range c.Caches { if err := cache.Get(key, &result); err == nil { - return result, nil + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return nil } } var err error - if result, err = c.loadStation(evaId); err == nil { + if err = load(&result); err == nil { for _, cache := range c.Caches { _ = cache.Set(key, result) } } + return err +} + +func (c *ApiClient) Station(evaId int64) ([]Station, error) { + key := fmt.Sprintf("realtime_recent %d", evaId) + var result []Station + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadStation(evaId) + return err + }) return result, err } @@ -67,17 +81,11 @@ func (c *ApiClient) Timetable(evaId int64, date time.Time) (Timetable, error) { key := fmt.Sprintf("timetable %d %s", evaId, date.Format(cacheTimestamp)) var result Timetable - for _, cache := range c.Caches { - if err := cache.Get(key, &result); err == nil { - return result, nil - } - } - var err error - if result, err = c.loadTimetable(evaId, date); err == nil { - for _, cache := range c.Caches { - _ = cache.Set(key, result) - } - } + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadTimetable(evaId, date) + return err + }) return result, err } @@ -109,17 +117,11 @@ func (c *ApiClient) RealtimeAll(evaId int64, date time.Time) (Timetable, error) key := fmt.Sprintf("realtime_all %d %s", evaId, date.Format(cacheTimestamp)) var result Timetable - for _, cache := range c.Caches { - if err := cache.Get(key, &result); err == nil { - return result, nil - } - } - var err error - if result, err = c.loadRealtimeAll(evaId, date); err == nil { - for _, cache := range c.Caches { - _ = cache.Set(key, result) - } - } + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadRealtimeAll(evaId, date) + return err + }) return result, err } @@ -150,17 +152,11 @@ func (c *ApiClient) RealtimeRecent(evaId int64, date time.Time) (Timetable, erro key := fmt.Sprintf("realtime_recent %d %s", evaId, date.Format(cacheTimestamp)) var result Timetable - for _, cache := range c.Caches { - if err := cache.Get(key, &result); err == nil { - return result, nil - } - } - var err error - if result, err = c.loadRealtimeRecent(evaId, date); err == nil { - for _, cache := range c.Caches { - _ = cache.Set(key, result) - } - } + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadRealtimeRecent(evaId, date) + return err + }) return result, err } @@ -191,17 +187,11 @@ func (c *ApiClient) WingDefinition(parent string, wing string) (WingDefinition, key := fmt.Sprintf("wing_definition %s %s", parent, wing) var result WingDefinition - for _, cache := range c.Caches { - if err := cache.Get(key, &result); err == nil { - return result, nil - } - } - var err error - if result, err = c.loadWingDefinition(parent, wing); err == nil { - for _, cache := range c.Caches { - _ = cache.Set(key, result) - } - } + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadWingDefinition(parent, wing) + return err + }) return result, err } @@ -232,17 +222,11 @@ func (c *ApiClient) CoachSequence(line string, date time.Time) (CoachSequence, e key := fmt.Sprintf("coach_sequence %s %s", line, date.Format(cacheTimestamp)) var result CoachSequence - for _, cache := range c.Caches { - if err := cache.Get(key, &result); err == nil { - return result, nil - } - } - var err error - if result, err = c.loadCoachSequence(line, date); err == nil { - for _, cache := range c.Caches { - _ = cache.Set(key, result) - } - } + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadCoachSequence(line, date) + return err + }) return result, err } @@ -273,17 +257,11 @@ func (c *ApiClient) Suggestions(line string, date time.Time) ([]Suggestion, erro key := fmt.Sprintf("suggestions %s %s", line, date.Format(cacheTimestamp)) var result []Suggestion - for _, cache := range c.Caches { - if err := cache.Get(key, &result); err == nil { - return result, nil - } - } - var err error - if result, err = c.loadSuggestions(line, date); err == nil { - for _, cache := range c.Caches { - _ = cache.Set(key, result) - } - } + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadSuggestions(line, date) + return err + }) return result, err } @@ -335,17 +313,11 @@ func (c *ApiClient) HafasMessages(trainlink string) ([]HafasMessage, error) { key := fmt.Sprintf("hafas_messages %s", trainlink) var result []HafasMessage - for _, cache := range c.Caches { - if err := cache.Get(key, &result); err == nil { - return result, nil - } - } - var err error - if result, err = c.loadHafasMessages(trainlink); err == nil { - for _, cache := range c.Caches { - _ = cache.Set(key, result) - } - } + err := c.loadWithCache(key, &result, func(target interface{}) error { + var err error + target, err = c.loadHafasMessages(trainlink) + return err + }) return result, err }