Files
govpp-snmp-agentx/go-agentx/value/oid.go

104 lines
2.2 KiB
Go

// 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, ".")
}