...
1 package cache
2
3 import (
4 "errors"
5 "fmt"
6
7 v1 "github.com/google/go-containerregistry/pkg/v1"
8 )
9
10
11 type cachingIndex struct {
12 wrappedIndex
13 cache *LazyCache
14 }
15
16
17
18 type wrappedIndex v1.ImageIndex
19
20
21
22
23 func ImageIndex(ii v1.ImageIndex, c *LazyCache) v1.ImageIndex {
24 return &cachingIndex{
25 wrappedIndex: ii,
26 cache: c,
27 }
28 }
29
30
31 func (c *cachingIndex) Image(h v1.Hash) (v1.Image, error) {
32 if cached, err := c.cache.getImage(h); err == nil {
33 return cached, nil
34 } else if !errors.Is(err, ErrNotFound) {
35 return nil, err
36 }
37 img, err := c.wrappedIndex.Image(h)
38 if err != nil {
39 return nil, fmt.Errorf("failed to get uncached Image: %v", err)
40 }
41 return c.cache.putImage(img)
42 }
43
44
45 func (c *cachingIndex) ImageIndex(h v1.Hash) (v1.ImageIndex, error) {
46 if cached, err := c.cache.getIndex(h); err == nil {
47 return cached, nil
48 } else if !errors.Is(err, ErrNotFound) {
49 return nil, err
50 }
51 ii, err := c.wrappedIndex.ImageIndex(h)
52 if err != nil {
53 return nil, fmt.Errorf("failed to get uncached ImageIndex: %v", err)
54 }
55
56 return c.cache.putIndex(ii)
57 }
58
View as plain text