Temporarily add go-agentx (w/ fixes to lexico ordering)
This commit is contained in:
103
go-agentx/value/oid.go
Normal file
103
go-agentx/value/oid.go
Normal file
@ -0,0 +1,103 @@
|
||||
// Copyright 2018 The agentx authors
|
||||
// Licensed under the LGPLv3 with static-linking exception.
|
||||
// See LICENCE file for details.
|
||||
|
||||
package value
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// OID defines an OID.
|
||||
type OID []uint32
|
||||
|
||||
// ParseOID parses the provided string and returns a valid oid. If one of the
|
||||
// subidentifers canot be parsed to an uint32, the function will panic.
|
||||
func ParseOID(text string) (OID, error) {
|
||||
var result OID
|
||||
|
||||
parts := strings.Split(text, ".")
|
||||
for _, part := range parts {
|
||||
subidentifier, err := strconv.ParseUint(part, 10, 32)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("parse uint [%s]: %w", part, err)
|
||||
}
|
||||
result = append(result, uint32(subidentifier))
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// MustParseOID works like ParseOID expect it panics on a parsing error.
|
||||
func MustParseOID(text string) OID {
|
||||
result, err := ParseOID(text)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// First returns the first n subidentifiers as a new oid.
|
||||
func (o OID) First(count int) OID {
|
||||
return o[:count]
|
||||
}
|
||||
|
||||
// CommonPrefix compares the oid with the provided one and
|
||||
// returns a new oid containing all matching prefix subidentifiers.
|
||||
func (o OID) CommonPrefix(other OID) OID {
|
||||
matchCount := 0
|
||||
|
||||
for index, subidentifier := range o {
|
||||
if index >= len(other) || subidentifier != other[index] {
|
||||
break
|
||||
}
|
||||
matchCount++
|
||||
}
|
||||
|
||||
return o[:matchCount]
|
||||
}
|
||||
|
||||
// CompareOIDs returns an integer comparing two OIDs lexicographically.
|
||||
// The result will be 0 if oid1 == oid2, -1 if oid1 < oid2, +1 if oid1 > oid2.
|
||||
func CompareOIDs(oid1, oid2 OID) int {
|
||||
if oid2 != nil {
|
||||
oid1Length := len(oid1)
|
||||
oid2Length := len(oid2)
|
||||
for i := 0; i < oid1Length && i < oid2Length; i++ {
|
||||
if oid1[i] < oid2[i] {
|
||||
return -1
|
||||
}
|
||||
if oid1[i] > oid2[i] {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
if oid1Length == oid2Length {
|
||||
return 0
|
||||
} else if oid1Length < oid2Length {
|
||||
return -1
|
||||
} else {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
return 1
|
||||
}
|
||||
|
||||
// SortOIDs performs sorting of the OID list.
|
||||
func SortOIDs(oids []OID) {
|
||||
sort.Slice(oids, func(i, j int) bool {
|
||||
return CompareOIDs(oids[i], oids[j]) == -1
|
||||
})
|
||||
}
|
||||
|
||||
func (o OID) String() string {
|
||||
var parts []string
|
||||
|
||||
for _, subidentifier := range o {
|
||||
parts = append(parts, fmt.Sprintf("%d", subidentifier))
|
||||
}
|
||||
|
||||
return strings.Join(parts, ".")
|
||||
}
|
Reference in New Issue
Block a user