structmapper/registry.go
2025-08-07 16:23:09 +02:00

58 lines
1.3 KiB
Go

package structmapper
import (
"fmt"
"sync"
exception "git.apihub24.de/admin/exception"
di "git.apihub24.de/admin/generic-di"
)
func init() {
di.Injectable(newMapperRegistry)
}
var (
MappingStrategyNotFound = exception.NewCustom("MappingStrategyNotFound")
StrategyRuntimeException = exception.NewCustom("StrategyRuntimeException")
)
func newMapperRegistry() *mapperRegistry {
return &mapperRegistry{
strategies: map[string]func(any) (any, error){},
mu: sync.Mutex{},
}
}
type mapperRegistry struct {
strategies map[string]func(any) (any, error)
mu sync.Mutex
}
func (registry *mapperRegistry) Run(key string, value any) (any, error) {
strategy, ok := registry.strategies[key]
if !ok {
return nil, MappingStrategyNotFound.With(fmt.Errorf("strategy key %s", key))
}
var err error
resultRef, err := strategy(value)
if err != nil {
return nil, StrategyRuntimeException.With(err)
}
return resultRef, nil
}
func (registry *mapperRegistry) RegisterStrategy(key string, strategy func(any) (any, error)) {
registry.mu.Lock()
defer registry.mu.Unlock()
registry.strategies[key] = strategy
}
func (registry *mapperRegistry) UnregisterStrategy(key string) {
registry.mu.Lock()
defer registry.mu.Unlock()
delete(registry.strategies, key)
}