104 lines
2.2 KiB
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, ".")
|
|
}
|