Files
kgpz_web/providers/xmlprovider/resolver.go
2025-01-07 20:13:08 +01:00

45 lines
1.2 KiB
Go

package xmlprovider
// INFO: This is used to resolve references (back-links) between XML items.
import (
"fmt"
"sync"
)
type Resolver[T XMLItem] struct {
index map[string]map[string][]Resolved[T] // Map[typeName][refID] -> []*T
mu sync.Mutex // Synchronization for thread safety
}
func NewResolver[T XMLItem]() *Resolver[T] {
return &Resolver[T]{index: make(map[string]map[string][]Resolved[T])}
}
func (r *Resolver[T]) Add(typeName, refID string, item Resolved[T]) {
r.mu.Lock()
defer r.mu.Unlock()
if _, exists := r.index[typeName]; !exists {
r.index[typeName] = make(map[string][]Resolved[T])
}
r.index[typeName][refID] = append(r.index[typeName][refID], item)
}
func (r *Resolver[T]) Get(typeName, refID string) ([]Resolved[T], error) {
if typeIndex, exists := r.index[typeName]; exists {
if items, ok := typeIndex[refID]; ok {
return items, nil
}
return nil, fmt.Errorf("no references found for refID '%s' of type '%s'", refID, typeName)
}
return nil, fmt.Errorf("no index exists for type '%s'", typeName)
}
func (r *Resolver[T]) Clear() {
r.mu.Lock()
defer r.mu.Unlock()
r.index = make(map[string]map[string][]Resolved[T])
}