109 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package table
 | 
						|
 | 
						|
// LookupPolicy defines query policy
 | 
						|
type LookupPolicy int
 | 
						|
 | 
						|
const (
 | 
						|
	// DiscardIfNone discards query when no route is found
 | 
						|
	DiscardIfNone LookupPolicy = iota
 | 
						|
	// ClosestMatch returns closest match to supplied query
 | 
						|
	ClosestMatch
 | 
						|
)
 | 
						|
 | 
						|
// String returns human representation of LookupPolicy
 | 
						|
func (lp LookupPolicy) String() string {
 | 
						|
	switch lp {
 | 
						|
	case DiscardIfNone:
 | 
						|
		return "DISCARD"
 | 
						|
	case ClosestMatch:
 | 
						|
		return "CLOSEST"
 | 
						|
	default:
 | 
						|
		return "UNKNOWN"
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// QueryOption sets routing table query options
 | 
						|
type QueryOption func(*QueryOptions)
 | 
						|
 | 
						|
// QueryOptions are routing table query options
 | 
						|
type QueryOptions struct {
 | 
						|
	// Service is destination service name
 | 
						|
	Service string
 | 
						|
	// Gateway is route gateway
 | 
						|
	Gateway string
 | 
						|
	// Network is network address
 | 
						|
	Network string
 | 
						|
	// Policy is query lookup policy
 | 
						|
	Policy LookupPolicy
 | 
						|
}
 | 
						|
 | 
						|
// QueryService sets destination address
 | 
						|
func QueryService(s string) QueryOption {
 | 
						|
	return func(o *QueryOptions) {
 | 
						|
		o.Service = s
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// QueryGateway sets route gateway
 | 
						|
func QueryGateway(g string) QueryOption {
 | 
						|
	return func(o *QueryOptions) {
 | 
						|
		o.Gateway = g
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// QueryNetwork sets route network address
 | 
						|
func QueryNetwork(n string) QueryOption {
 | 
						|
	return func(o *QueryOptions) {
 | 
						|
		o.Network = n
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// QueryPolicy sets query policy
 | 
						|
// NOTE: this might be renamed to filter or some such
 | 
						|
func QueryPolicy(p LookupPolicy) QueryOption {
 | 
						|
	return func(o *QueryOptions) {
 | 
						|
		o.Policy = p
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Query is routing table query
 | 
						|
type Query interface {
 | 
						|
	// Options returns query options
 | 
						|
	Options() QueryOptions
 | 
						|
}
 | 
						|
 | 
						|
// query is a basic implementation of Query
 | 
						|
type query struct {
 | 
						|
	opts QueryOptions
 | 
						|
}
 | 
						|
 | 
						|
// NewQuery creates new query and returns it
 | 
						|
func NewQuery(opts ...QueryOption) Query {
 | 
						|
	// default options
 | 
						|
	// NOTE: by default we use DefaultNetworkMetric
 | 
						|
	qopts := QueryOptions{
 | 
						|
		Service: "*",
 | 
						|
		Gateway: "*",
 | 
						|
		Network: "*",
 | 
						|
		Policy:  DiscardIfNone,
 | 
						|
	}
 | 
						|
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&qopts)
 | 
						|
	}
 | 
						|
 | 
						|
	return &query{
 | 
						|
		opts: qopts,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Options returns query options
 | 
						|
func (q *query) Options() QueryOptions {
 | 
						|
	return q.opts
 | 
						|
}
 | 
						|
 | 
						|
// String prints routing table query in human readable form
 | 
						|
func (q query) String() string {
 | 
						|
	return "query"
 | 
						|
}
 |