Temporarily add go-agentx (w/ fixes to lexico ordering)
This commit is contained in:
66
go-agentx/list_handler.go
Normal file
66
go-agentx/list_handler.go
Normal file
@ -0,0 +1,66 @@
|
||||
// Copyright 2018 The agentx authors
|
||||
// Licensed under the LGPLv3 with static-linking exception.
|
||||
// See LICENCE file for details.
|
||||
|
||||
package agentx
|
||||
|
||||
import (
|
||||
"github.com/posteo/go-agentx/pdu"
|
||||
"github.com/posteo/go-agentx/value"
|
||||
)
|
||||
|
||||
// ListHandler is a helper that takes a list of oids and implements
|
||||
// a default behaviour for that list.
|
||||
type ListHandler struct {
|
||||
oids []value.OID
|
||||
items map[string]*ListItem
|
||||
}
|
||||
|
||||
// Add adds a list item for the provided oid and returns it.
|
||||
func (l *ListHandler) Add(oid string) *ListItem {
|
||||
if l.items == nil {
|
||||
l.items = make(map[string]*ListItem)
|
||||
}
|
||||
|
||||
parsedOID := value.MustParseOID(oid)
|
||||
l.oids = append(l.oids, parsedOID)
|
||||
value.SortOIDs(l.oids)
|
||||
item := &ListItem{}
|
||||
l.items[oid] = item
|
||||
return item
|
||||
}
|
||||
|
||||
// Get tries to find the provided oid and returns the corresponding value.
|
||||
func (l *ListHandler) Get(oid value.OID) (value.OID, pdu.VariableType, interface{}, error) {
|
||||
if l.items == nil {
|
||||
return nil, pdu.VariableTypeNoSuchObject, nil, nil
|
||||
}
|
||||
|
||||
item, ok := l.items[oid.String()]
|
||||
if ok {
|
||||
return oid, item.Type, item.Value, nil
|
||||
}
|
||||
return nil, pdu.VariableTypeNoSuchObject, nil, nil
|
||||
}
|
||||
|
||||
// GetNext tries to find the value that follows the provided oid and returns it.
|
||||
func (l *ListHandler) GetNext(from value.OID, includeFrom bool, to value.OID) (value.OID, pdu.VariableType, interface{}, error) {
|
||||
if l.items == nil {
|
||||
return nil, pdu.VariableTypeNoSuchObject, nil, nil
|
||||
}
|
||||
|
||||
for _, oid := range l.oids {
|
||||
if oidWithin(oid, from, includeFrom, to) {
|
||||
return l.Get(oid)
|
||||
}
|
||||
}
|
||||
|
||||
return nil, pdu.VariableTypeNoSuchObject, nil, nil
|
||||
}
|
||||
|
||||
func oidWithin(oid value.OID, from value.OID, includeFrom bool, to value.OID) bool {
|
||||
fromCompare := value.CompareOIDs(from, oid)
|
||||
toCompare := value.CompareOIDs(to, oid)
|
||||
|
||||
return (fromCompare == -1 || (fromCompare == 0 && includeFrom)) && (toCompare == 1)
|
||||
}
|
Reference in New Issue
Block a user