github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/dsref/mem_resolver.go (about) 1 package dsref 2 3 import ( 4 "context" 5 "fmt" 6 ) 7 8 // MemResolver holds maps that can do a cheap version of dataset resolution, 9 // for tests 10 type MemResolver struct { 11 Username string 12 RefMap map[string]string 13 IDMap map[string]VersionInfo 14 } 15 16 // assert at compile time that MemResolver is a Resolver 17 var _ Resolver = (*MemResolver)(nil) 18 19 // NewMemResolver returns a new MemResolver 20 func NewMemResolver(username string) *MemResolver { 21 return &MemResolver{ 22 Username: username, 23 RefMap: make(map[string]string), 24 IDMap: make(map[string]VersionInfo), 25 } 26 } 27 28 // Put adds a VersionInfo to the resolver 29 func (m *MemResolver) Put(info VersionInfo) { 30 refStr := fmt.Sprintf("%s/%s", info.Username, info.Name) 31 initID := info.InitID 32 m.RefMap[refStr] = initID 33 m.IDMap[initID] = info 34 } 35 36 // GetInfo returns a VersionInfo by initID, or nil if not found 37 func (m *MemResolver) GetInfo(initID string) *VersionInfo { 38 if info, ok := m.IDMap[initID]; ok { 39 return &info 40 } 41 return nil 42 } 43 44 // ResolveRef finds the identifier & head path for a dataset reference 45 // implements resolve.NameResolver interface 46 func (m *MemResolver) ResolveRef(ctx context.Context, ref *Ref) (string, error) { 47 if m == nil { 48 return "", ErrRefNotFound 49 } 50 51 if ref.InitID != "" { 52 return m.completeRef(ctx, ref) 53 } 54 55 id := m.RefMap[ref.Alias()] 56 resolved, ok := m.IDMap[id] 57 if !ok { 58 return "", ErrRefNotFound 59 } 60 61 ref.InitID = id 62 ref.ProfileID = resolved.ProfileID 63 if ref.Path == "" { 64 ref.Path = resolved.Path 65 } 66 67 return "", nil 68 } 69 70 func (m *MemResolver) completeRef(ctx context.Context, ref *Ref) (string, error) { 71 info, ok := m.IDMap[ref.InitID] 72 if !ok { 73 return "", ErrRefNotFound 74 } 75 76 ref.ProfileID = info.ProfileID 77 ref.Path = info.Path 78 ref.Username = info.Username 79 ref.Name = info.Name 80 return "", nil 81 }