[VOL-936] Add changes in voltctl for Onu distance from OLT

Change-Id: If3d7a3f72ac876f495f202f928d244b1ee6e64c5
diff --git a/pkg/model/returnvalues.go b/pkg/model/returnvalues.go
new file mode 100755
index 0000000..88fa2e5
--- /dev/null
+++ b/pkg/model/returnvalues.go
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2019-present Ciena Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package model
+
+import (
+	"github.com/jhump/protoreflect/desc"
+	"github.com/jhump/protoreflect/dynamic"
+)
+
+type ReturnValueRow struct {
+	Name   string      `json:"name"`
+	Result interface{} `json:"result"`
+}
+
+type ReturnValues struct {
+	Set         uint32 `json:"set"`
+	Unsupported uint32 `json:"unsupported"`
+	Error       uint32 `json:"error"`
+	Distance    uint32 `json:"distance"`
+}
+
+func (r *ReturnValues) PopulateFrom(val *dynamic.Message) {
+	r.Set = val.GetFieldByName("Set").(uint32)
+	r.Unsupported = val.GetFieldByName("Unsupported").(uint32)
+	r.Error = val.GetFieldByName("Error").(uint32)
+	r.Distance = val.GetFieldByName("Distance").(uint32)
+}
+
+// Given a list of allowed enum values, check each one of the values against the
+// bitmaps, and fill out an array of result rows as follows:
+//    "Error", if the enum is set in the Error bitmap
+//    "Unsupported", if the enum is set in the Unsupported bitmap
+//    An interface containing the value, if the enum is set in the Set bitmap
+
+func (r *ReturnValues) GetKeyValuePairs(enumValues []*desc.EnumValueDescriptor) []ReturnValueRow {
+	var rows []ReturnValueRow
+
+	for _, v := range enumValues {
+		num := uint32(v.GetNumber())
+		if num == 0 {
+			// EMPTY is not a real value
+			continue
+		}
+		name := v.GetName()
+		if (r.Error & num) != 0 {
+			row := ReturnValueRow{Name: name, Result: "Error"}
+			rows = append(rows, row)
+		}
+		if (r.Unsupported & num) != 0 {
+			row := ReturnValueRow{Name: name, Result: "Unsupported"}
+			rows = append(rows, row)
+		}
+		if (r.Set & num) != 0 {
+			switch name {
+			case "DISTANCE":
+				row := ReturnValueRow{Name: name, Result: r.Distance}
+				rows = append(rows, row)
+			default:
+				row := ReturnValueRow{Name: name, Result: "Unimplemented-in-voltctl"}
+				rows = append(rows, row)
+			}
+		}
+	}
+
+	return rows
+}