Skip to content
Snippets Groups Projects
filter.go 1.09 KiB
Newer Older
  • Learn to ignore specific revisions
  • package filter
    
    import (
    	"github.com/bio-routing/bio-rd/net"
    	"github.com/bio-routing/bio-rd/route"
    	"github.com/bio-routing/bio-rd/routingtable"
    )
    
    type Filter struct {
    	routingtable.ClientManager
    	terms []*Term
    }
    
    func NewFilter(terms []*Term) *Filter {
    	f := &Filter{
    		terms: terms,
    	}
    	f.ClientManager = routingtable.NewClientManager(f)
    
    	return f
    }
    
    func (f *Filter) AddPath(p net.Prefix, pa *route.Path) error {
    	pa, rejected := f.processTerms(p, pa)
    	if rejected {
    		return nil
    	}
    
    	for _, c := range f.Clients() {
    		c.AddPath(p, pa)
    	}
    
    	return nil
    }
    
    func (f *Filter) RemovePath(p net.Prefix, pa *route.Path) bool {
    	pa, rejected := f.processTerms(p, pa)
    	if rejected {
    		return false
    	}
    
    	for _, c := range f.Clients() {
    		c.RemovePath(p, pa)
    	}
    
    	return true
    }
    
    func (f *Filter) UpdateNewClient(c routingtable.RouteTableClient) error {
    	return nil
    }
    
    func (f *Filter) processTerms(p net.Prefix, pa *route.Path) (modPath *route.Path, reject bool) {
    	modPath = pa
    
    	for _, t := range f.terms {
    		modPath, reject = t.Process(p, modPath)
    		if reject {
    			return modPath, true
    		}
    	}
    
    	return modPath, false
    }