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 }