~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
61 lines · 1.3 KB Raw History
package registry

import (
	"sort"
	"sync"

	"github.com/johnandersen777/socialweb-computer-kcp/internal/policyengine/executor"
)

type Registry struct {
	mu        sync.RWMutex
	executors map[string]executor.Executor
}

func New(executors ...executor.Executor) *Registry {
	registry := &Registry{executors: make(map[string]executor.Executor)}
	for _, item := range executors {
		registry.Register(item)
	}
	return registry
}

func (r *Registry) Register(item executor.Executor) {
	if item == nil {
		return
	}
	r.mu.Lock()
	defer r.mu.Unlock()
	r.executors[item.Kind()] = item
}

func (r *Registry) Get(kind string) (executor.Executor, bool) {
	r.mu.RLock()
	defer r.mu.RUnlock()
	item, ok := r.executors[kind]
	return item, ok
}

func (r *Registry) Kinds() []string {
	r.mu.RLock()
	defer r.mu.RUnlock()
	out := make([]string, 0, len(r.executors))
	for kind := range r.executors {
		out = append(out, kind)
	}
	sort.Strings(out)
	return out
}

func GhaLiteOnly(ghaLite executor.Executor) *Registry {
	registry := New(ghaLite)
	registry.Register(executor.NewDeny(
		executor.PolicyTypescriptNSID,
		"typescript policy records are disabled; the policy engine is gha-lite only",
	))
	registry.Register(executor.NewDeny(
		executor.PolicyDenoWorkerNSID,
		"denoWorker policy records are disabled; the policy engine is gha-lite only",
	))
	return registry
}