diff --git a/nucleus/util/convert.go b/nucleus/util/convert.go index 1c98020ed65dd3d16603e4b788668f5ab11982fd..ba49998313fb6ab965f3139c8b5773b6ebcbe1b1 100644 --- a/nucleus/util/convert.go +++ b/nucleus/util/convert.go @@ -2,95 +2,74 @@ package util import ( "fmt" - gpb "github.com/openconfig/gnmi/proto/gnmi" + "strconv" + + "github.com/openconfig/gnmi/proto/gnmi" gnmiv "github.com/openconfig/gnmi/value" "github.com/openconfig/goyang/pkg/yang" - "strconv" ) // ConvertStringToTypedValue takes a value as string and a YangType. The // returned value is the converted TypedValue of the given string based on the // given YangType. -func ConvertStringToTypedValue(s string, t *yang.YangType) (*gpb.TypedValue, error) { +func ConvertStringToTypedValue(s string, t *yang.YangType) (*gnmi.TypedValue, error) { // TODO: add more types switch t.Kind { case yang.Yint8: - parsedInt, err := strconv.ParseInt(s, 10, 8) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(int8(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil + return convertStringToIntTypedValue(s, 10, 8) case yang.Yint16: - parsedInt, err := strconv.ParseInt(s, 10, 16) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(int16(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil + return convertStringToIntTypedValue(s, 10, 16) case yang.Yint32: - parsedInt, err := strconv.ParseInt(s, 10, 32) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(int32(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil + return convertStringToIntTypedValue(s, 10, 32) case yang.Yuint8: - parsedInt, err := strconv.ParseUint(s, 10, 8) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(uint8(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil + return convertStringToUintTypedValue(s, 10, 8) case yang.Yuint16: - parsedInt, err := strconv.ParseUint(s, 10, 16) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(uint16(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil + return convertStringToUintTypedValue(s, 10, 16) case yang.Yuint32: - parsedInt, err := strconv.ParseUint(s, 10, 32) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(uint32(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil + return convertStringToUintTypedValue(s, 10, 32) case yang.Ybool: parsedBool, err := strconv.ParseBool(s) if err != nil { return nil, err } - tv, err := gnmiv.FromScalar(parsedBool) - if err != nil { - return nil, err - } - return tv, nil + return gnmiv.FromScalar(parsedBool) case yang.Ystring: - tv, err := gnmiv.FromScalar(s) - if err != nil { - return nil, err - } - return tv, nil + return gnmiv.FromScalar(s) + default: + return nil, fmt.Errorf("could not convert to TypedValue, unsupported type of: %v", t) + } +} + +func convertStringToIntTypedValue(s string, base int, bitSize int) (*gnmi.TypedValue, error) { + parsedInt, err := strconv.ParseInt(s, base, bitSize) + if err != nil { + return nil, err + } + switch bitSize { + case 8: + return gnmiv.FromScalar(int8(parsedInt)) + case 16: + return gnmiv.FromScalar(int16(parsedInt)) + case 32: + return gnmiv.FromScalar(int32(parsedInt)) + default: + return nil, fmt.Errorf("could not convert string %s to a gnmi.TypedValue (int), unsupported bitSize of: %d", s, bitSize) + } +} + +func convertStringToUintTypedValue(s string, base int, bitSize int) (*gnmi.TypedValue, error) { + parsedInt, err := strconv.ParseUint(s, base, bitSize) + if err != nil { + return nil, err + } + switch bitSize { + case 8: + return gnmiv.FromScalar(uint8(parsedInt)) + case 16: + return gnmiv.FromScalar(uint16(parsedInt)) + case 32: + return gnmiv.FromScalar(uint32(parsedInt)) default: - return nil, fmt.Errorf("unsupported type to convert to TypedValue") + return nil, fmt.Errorf("could not convert string %s to a gnmi.TypedValue (uint), unsupported bitSize of: %d", s, bitSize) } }