mirror of
				https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
				synced 2025-10-31 09:55:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package xmlprovider
 | |
| 
 | |
| // INFO: This is used to resolve references (back-links) between XML items.
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"sync"
 | |
| )
 | |
| 
 | |
| type Resolver[T IXMLItem] struct {
 | |
| 	// INFO: map[type][ID]
 | |
| 	index map[string]map[string][]Resolved[T]
 | |
| 	mu    sync.RWMutex
 | |
| }
 | |
| 
 | |
| func NewResolver[T IXMLItem]() *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) {
 | |
| 	r.mu.RLock()
 | |
| 	defer r.mu.RUnlock()
 | |
| 
 | |
| 	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])
 | |
| }
 | 
