@@ -17,6 +17,7 @@ package internal
1717import (
1818 "encoding/json"
1919 "fmt"
20+ "log/slog"
2021 "net/http"
2122
2223 "github.com/bartventer/httpcache/store/driver"
@@ -46,22 +47,53 @@ func NewResponseCache(cache Cache) *responseCache {
4647
4748var _ ResponseCache = (* responseCache )(nil )
4849
50+ type CacheError struct {
51+ Op string
52+ Message string
53+ Err error
54+ }
55+
56+ func (c * CacheError ) Error () string { return fmt .Sprintf ("%s: %s: %v" , c .Op , c .Message , c .Err ) }
57+ func (c * CacheError ) Unwrap () error { return c .Err }
58+
59+ func (c * CacheError ) LogValue () slog.Value {
60+ return slog .GroupValue (
61+ slog .String ("op" , c .Op ),
62+ slog .String ("message" , c .Message ),
63+ slog .Any ("error" , c .Err ),
64+ )
65+ }
66+
67+ func newCacheError (err error , op , message string ) * CacheError {
68+ return & CacheError {Op : op , Message : message , Err : err }
69+ }
70+
71+ var _ slog.LogValuer = (* CacheError )(nil )
72+
4973func (r * responseCache ) Get (responseKey string , req * http.Request ) (* Response , error ) {
5074 data , err := r .cache .Get (responseKey )
5175 if err != nil {
5276 return nil , err
5377 }
5478 entry , err := ParseResponse (data , req )
5579 if err != nil {
56- return nil , fmt .Errorf ("failed to unmarshal cached entry: %w" , err )
80+ return nil , newCacheError (
81+ err ,
82+ "Get" ,
83+ fmt .Sprintf ("failed to unmarshal cached entry for key %q" , responseKey ),
84+ )
5785 }
5886 return entry , nil
5987}
6088
6189func (r * responseCache ) Set (responseKey string , entry * Response ) error {
6290 data , err := entry .MarshalBinary ()
6391 if err != nil {
64- return fmt .Errorf ("failed to marshal entry: %w" , err )
92+ return newCacheError (
93+ err ,
94+ "Set" ,
95+ fmt .Sprintf ("failed to marshal entry for key %q" , responseKey ),
96+ )
6597 }
6698 return r .cache .Set (responseKey , data )
6799}
@@ -77,15 +109,23 @@ func (r *responseCache) GetRefs(urlKey string) (ResponseRefs, error) {
77109 }
78110 var refs ResponseRefs
79111 if unmarshalErr := json .Unmarshal (data , & refs ); unmarshalErr != nil {
80- return nil , fmt .Errorf ("failed to unmarshal cached entries: %w" , unmarshalErr )
112+ return nil , newCacheError (
113+ unmarshalErr ,
114+ "GetRefs" ,
115+ fmt .Sprintf ("failed to unmarshal cached refs for key %q" , urlKey ),
116+ )
81117 }
82118 return refs , nil
83119}
84120
85121func (r * responseCache ) SetRefs (urlKey string , refs ResponseRefs ) error {
86122 data , err := json .Marshal (refs )
87123 if err != nil {
88- return fmt .Errorf ("failed to marshal headers: %w" , err )
124+ return newCacheError (
125+ err ,
126+ "SetRefs" ,
127+ fmt .Sprintf ("failed to marshal refs for key %q" , urlKey ),
128+ )
89129 }
90130 return r .cache .Set (urlKey , data )
91131}
0 commit comments