package mesh import "sync" type Catalog struct { mu sync.RWMutex byID map[string]NodeInfo } func NewCatalog() *Catalog { return &Catalog{byID: map[string]NodeInfo{}} } func (c *Catalog) Set(n NodeInfo) { c.mu.Lock(); c.byID[n.NodeID] = n; c.mu.Unlock() } func (c *Catalog) Replace(nodes []NodeInfo) { c.mu.Lock() defer c.mu.Unlock() c.byID = map[string]NodeInfo{} for _, n := range nodes { c.byID[n.NodeID] = n } } func (c *Catalog) All() []NodeInfo { c.mu.RLock() defer c.mu.RUnlock() out := make([]NodeInfo, 0, len(c.byID)) for _, n := range c.byID { out = append(out, n) } return out } func (c *Catalog) IDs() []string { c.mu.RLock() defer c.mu.RUnlock() out := make([]string, 0, len(c.byID)) for id := range c.byID { out = append(out, id) } return out } func (c *Catalog) ByID(id string) (NodeInfo, bool) { c.mu.RLock() defer c.mu.RUnlock() n, ok := c.byID[id] return n, ok }