package connectors import ( "context" "errors" "sync" ) type Connector interface { ID() string Name() string Description() string Execute(ctx context.Context, action string, params map[string]interface{}) (interface{}, error) GetActions() []Action Validate(params map[string]interface{}) error } type Action struct { Name string `json:"name"` Description string `json:"description"` Schema map[string]interface{} `json:"schema"` Required []string `json:"required"` } type ConnectorHub struct { connectors map[string]Connector mu sync.RWMutex } func NewConnectorHub() *ConnectorHub { return &ConnectorHub{ connectors: make(map[string]Connector), } } func (h *ConnectorHub) Register(connector Connector) { h.mu.Lock() defer h.mu.Unlock() h.connectors[connector.ID()] = connector } func (h *ConnectorHub) Unregister(id string) { h.mu.Lock() defer h.mu.Unlock() delete(h.connectors, id) } func (h *ConnectorHub) Get(id string) (Connector, error) { h.mu.RLock() defer h.mu.RUnlock() connector, ok := h.connectors[id] if !ok { return nil, errors.New("connector not found: " + id) } return connector, nil } func (h *ConnectorHub) List() []Connector { h.mu.RLock() defer h.mu.RUnlock() result := make([]Connector, 0, len(h.connectors)) for _, c := range h.connectors { result = append(result, c) } return result } func (h *ConnectorHub) Execute(ctx context.Context, connectorID, action string, params map[string]interface{}) (interface{}, error) { connector, err := h.Get(connectorID) if err != nil { return nil, err } if err := connector.Validate(params); err != nil { return nil, err } return connector.Execute(ctx, action, params) } type ConnectorInfo struct { ID string `json:"id"` Name string `json:"name"` Description string `json:"description"` Actions []Action `json:"actions"` } func (h *ConnectorHub) GetInfo() []ConnectorInfo { h.mu.RLock() defer h.mu.RUnlock() result := make([]ConnectorInfo, 0, len(h.connectors)) for _, c := range h.connectors { result = append(result, ConnectorInfo{ ID: c.ID(), Name: c.Name(), Description: c.Description(), Actions: c.GetActions(), }) } return result }