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  }