lambda/core/agentsmap.go (103 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package core
import (
"errors"
"github.com/google/uuid"
)
// ErrAgentNameCollision means that agent with the same name already exists in AgentsMap
var ErrAgentNameCollision = errors.New("ErrAgentNameCollision")
// ErrAgentIDCollision means that agent with the same ID already exists in AgentsMap
var ErrAgentIDCollision = errors.New("ErrAgentIDCollision")
// ExternalAgentsMap stores Agents indexed by Name and ID
type ExternalAgentsMap struct {
byName map[string]*ExternalAgent
byID map[string]*ExternalAgent
}
// NewExternalAgentsMap creates empty ExternalAgentsMap
func NewExternalAgentsMap() ExternalAgentsMap {
return ExternalAgentsMap{
byName: make(map[string]*ExternalAgent),
byID: make(map[string]*ExternalAgent),
}
}
// Insert places agent into ExternalAgentsMap. Error is returned if agent with this ID or name already exists
func (m *ExternalAgentsMap) Insert(a *ExternalAgent) error {
if _, nameCollision := m.FindByName(a.Name); nameCollision {
return ErrAgentNameCollision
}
if _, idCollision := m.FindByID(a.ID); idCollision {
return ErrAgentIDCollision
}
m.byName[a.Name] = a
m.byID[a.ID.String()] = a
return nil
}
// FindByName finds agent by name
func (m *ExternalAgentsMap) FindByName(name string) (agent *ExternalAgent, found bool) {
agent, found = m.byName[name]
return
}
// FindByID finds agent by ID
func (m *ExternalAgentsMap) FindByID(id uuid.UUID) (agent *ExternalAgent, found bool) {
agent, found = m.byID[id.String()]
return
}
// Visit iterates through agents, calling cb for each of them
func (m *ExternalAgentsMap) Visit(cb func(*ExternalAgent)) {
for _, a := range m.byName {
cb(a)
}
}
// Size returns the number of agents contained in the datastructure
func (m *ExternalAgentsMap) Size() int {
return len(m.byName)
}
// AsArray returns shallow copy of all agents as a single array. The order of agents is unspecified.
func (m *ExternalAgentsMap) AsArray() []*ExternalAgent {
agents := make([]*ExternalAgent, 0, len(m.byName))
m.Visit(func(a *ExternalAgent) {
agents = append(agents, a)
})
return agents
}
func (m *ExternalAgentsMap) Clear() {
m.byName = make(map[string]*ExternalAgent)
m.byID = make(map[string]*ExternalAgent)
}
// InternalAgentsMap stores Agents indexed by Name and ID
type InternalAgentsMap struct {
byName map[string]*InternalAgent
byID map[string]*InternalAgent
}
// NewInternalAgentsMap creates empty InternalAgentsMap
func NewInternalAgentsMap() InternalAgentsMap {
return InternalAgentsMap{
byName: make(map[string]*InternalAgent),
byID: make(map[string]*InternalAgent),
}
}
// Insert places agent into InternalAgentsMap. Error is returned if agent with this ID or name already exists
func (m *InternalAgentsMap) Insert(a *InternalAgent) error {
if _, nameCollision := m.FindByName(a.Name); nameCollision {
return ErrAgentNameCollision
}
if _, idCollision := m.FindByID(a.ID); idCollision {
return ErrAgentIDCollision
}
m.byName[a.Name] = a
m.byID[a.ID.String()] = a
return nil
}
// FindByName finds agent by name
func (m *InternalAgentsMap) FindByName(name string) (agent *InternalAgent, found bool) {
agent, found = m.byName[name]
return
}
// FindByID finds agent by ID
func (m *InternalAgentsMap) FindByID(id uuid.UUID) (agent *InternalAgent, found bool) {
agent, found = m.byID[id.String()]
return
}
// Visit iterates through agents, calling cb for each of them
func (m *InternalAgentsMap) Visit(cb func(*InternalAgent)) {
for _, a := range m.byName {
cb(a)
}
}
// Size returns the number of agents contained in the datastructure
func (m *InternalAgentsMap) Size() int {
return len(m.byName)
}
// AsArray returns shallow copy of all agents as a single array. The order of agents is unspecified.
func (m *InternalAgentsMap) AsArray() []*InternalAgent {
agents := make([]*InternalAgent, 0, len(m.byName))
m.Visit(func(a *InternalAgent) {
agents = append(agents, a)
})
return agents
}
func (m *InternalAgentsMap) Clear() {
m.byName = make(map[string]*InternalAgent)
m.byID = make(map[string]*InternalAgent)
}