github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/lang/aliases.go (about)

     1  package lang
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"github.com/lmorg/murex/lang/ref"
     8  )
     9  
    10  type Alias struct {
    11  	Alias   []string
    12  	FileRef *ref.File
    13  }
    14  
    15  // Aliases is a table of aliases
    16  type Aliases struct {
    17  	aliases map[string]Alias
    18  	mutex   sync.Mutex
    19  }
    20  
    21  // NewAliases creates a new table of aliases
    22  func NewAliases() (a Aliases) {
    23  	a.aliases = make(map[string]Alias)
    24  	return
    25  }
    26  
    27  // Add creates an alias
    28  func (a *Aliases) Add(name string, alias []string, fileRef *ref.File) {
    29  	a.mutex.Lock()
    30  	a.aliases[name] = Alias{
    31  		Alias:   alias,
    32  		FileRef: fileRef,
    33  	}
    34  	a.mutex.Unlock()
    35  }
    36  
    37  // Exists checks if alias exists in table
    38  func (a *Aliases) Exists(name string) (exists bool) {
    39  	a.mutex.Lock()
    40  	_, exists = a.aliases[name]
    41  	a.mutex.Unlock()
    42  	return exists
    43  }
    44  
    45  // Get the aliased code
    46  func (a *Aliases) Get(name string) []string {
    47  	a.mutex.Lock()
    48  	alias, ok := a.aliases[name]
    49  	a.mutex.Unlock()
    50  
    51  	if !ok {
    52  		return nil
    53  	}
    54  
    55  	return alias.Alias
    56  }
    57  
    58  // Delete an alias
    59  func (a *Aliases) Delete(name string) error {
    60  	a.mutex.Lock()
    61  
    62  	if _, ok := a.aliases[name]; !ok {
    63  		a.mutex.Unlock()
    64  		return fmt.Errorf("no alias named '%s' exists", name)
    65  	}
    66  	delete(a.aliases, name)
    67  	a.mutex.Unlock()
    68  	return nil
    69  }
    70  
    71  // Dump returns the complete alias table
    72  func (a *Aliases) Dump() map[string]Alias {
    73  	a.mutex.Lock()
    74  	dump := a.aliases
    75  	a.mutex.Unlock()
    76  	return dump
    77  }
    78  
    79  // UpdateMap is used for auto-completions. It takes an existing map and updates it's values rather than copying data
    80  func (a *Aliases) UpdateMap(m map[string]bool) {
    81  	for name := range a.aliases {
    82  		m[name] = true
    83  	}
    84  }