1package cache
 2
 3import (
 4	"github.com/MichaelMure/git-bug/entity"
 5	"github.com/MichaelMure/git-bug/identity"
 6)
 7
 8var _ identity.Resolver = &identityCacheResolver{}
 9
10// identityCacheResolver is an identity Resolver that retrieve identities from
11// the cache
12type identityCacheResolver struct {
13	cache *RepoCache
14}
15
16func newIdentityCacheResolver(cache *RepoCache) *identityCacheResolver {
17	return &identityCacheResolver{cache: cache}
18}
19
20func (i *identityCacheResolver) ResolveIdentity(id entity.Id) (identity.Interface, error) {
21	return i.cache.ResolveIdentity(id)
22}
23
24var _ identity.Resolver = &identityCacheResolverNoLock{}
25
26// identityCacheResolverNoLock is an identity Resolver that retrieve identities from
27// the cache, without locking it.
28type identityCacheResolverNoLock struct {
29	cache *RepoCache
30}
31
32func newIdentityCacheResolverNoLock(cache *RepoCache) *identityCacheResolverNoLock {
33	return &identityCacheResolverNoLock{cache: cache}
34}
35
36func (ir *identityCacheResolverNoLock) ResolveIdentity(id entity.Id) (identity.Interface, error) {
37	cached, ok := ir.cache.identities[id]
38	if ok {
39		return cached, nil
40	}
41
42	i, err := identity.ReadLocal(ir.cache.repo, id)
43	if err != nil {
44		return nil, err
45	}
46
47	cached = NewIdentityCache(ir.cache, i)
48	ir.cache.identities[id] = cached
49
50	return cached, nil
51}