From 45f5f852b71a63c142bca8b05efe53eebf142594 Mon Sep 17 00:00:00 2001 From: Michael Muré Date: Sat, 13 Aug 2022 12:08:48 +0200 Subject: core: generalized resolvers to resolve any entity time when unmarshalling an operation --- identity/resolver.go | 47 +++++------------------------------------------ 1 file changed, 5 insertions(+), 42 deletions(-) (limited to 'identity/resolver.go') diff --git a/identity/resolver.go b/identity/resolver.go index 8e066e9d..5468a8f8 100644 --- a/identity/resolver.go +++ b/identity/resolver.go @@ -1,17 +1,11 @@ package identity import ( - "sync" - "github.com/MichaelMure/git-bug/entity" "github.com/MichaelMure/git-bug/repository" ) -// Resolver define the interface of an Identity resolver, able to load -// an identity from, for example, a repo or a cache. -type Resolver interface { - ResolveIdentity(id entity.Id) (Interface, error) -} +var _ entity.Resolver = &SimpleResolver{} // SimpleResolver is a Resolver loading Identities directly from a Repo type SimpleResolver struct { @@ -22,10 +16,12 @@ func NewSimpleResolver(repo repository.Repo) *SimpleResolver { return &SimpleResolver{repo: repo} } -func (r *SimpleResolver) ResolveIdentity(id entity.Id) (Interface, error) { +func (r *SimpleResolver) Resolve(id entity.Id) (entity.Interface, error) { return ReadLocal(r.repo, id) } +var _ entity.Resolver = &StubResolver{} + // StubResolver is a Resolver that doesn't load anything, only returning IdentityStub instances type StubResolver struct{} @@ -33,39 +29,6 @@ func NewStubResolver() *StubResolver { return &StubResolver{} } -func (s *StubResolver) ResolveIdentity(id entity.Id) (Interface, error) { +func (s *StubResolver) Resolve(id entity.Id) (entity.Interface, error) { return &IdentityStub{id: id}, nil } - -// CachedResolver is a resolver ensuring that loading is done only once through another Resolver. -type CachedResolver struct { - mu sync.RWMutex - resolver Resolver - identities map[entity.Id]Interface -} - -func NewCachedResolver(resolver Resolver) *CachedResolver { - return &CachedResolver{ - resolver: resolver, - identities: make(map[entity.Id]Interface), - } -} - -func (c *CachedResolver) ResolveIdentity(id entity.Id) (Interface, error) { - c.mu.RLock() - if i, ok := c.identities[id]; ok { - c.mu.RUnlock() - return i, nil - } - c.mu.RUnlock() - - c.mu.Lock() - defer c.mu.Unlock() - - i, err := c.resolver.ResolveIdentity(id) - if err != nil { - return nil, err - } - c.identities[id] = i - return i, nil -} -- cgit