diff options
author | Rastislav Szabo <raszabo@cisco.com> | 2017-05-25 13:47:43 +0200 |
---|---|---|
committer | Rastislav Szabo <raszabo@cisco.com> | 2017-05-25 13:54:13 +0200 |
commit | 2d07847237e754d9050f06f565baa430c70ed937 (patch) | |
tree | 80588aeec912e95fa21b51520bbd527eb87f455b /adapter/mock/binapi | |
parent | c38cb25d746736f062ee16e87f553c8a4ec5fced (diff) |
added async connect API, new structure of examples
Change-Id: Iab9bce174596c30998981e02b7030c248c423384
Signed-off-by: Rastislav Szabo <raszabo@cisco.com>
Diffstat (limited to 'adapter/mock/binapi')
-rw-r--r-- | adapter/mock/binapi/binapi_reflect.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/adapter/mock/binapi/binapi_reflect.go b/adapter/mock/binapi/binapi_reflect.go new file mode 100644 index 0000000..ee89909 --- /dev/null +++ b/adapter/mock/binapi/binapi_reflect.go @@ -0,0 +1,74 @@ +// Copyright (c) 2017 Cisco and/or its affiliates. +// +// 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 binapi is a helper package for generic handling of VPP binary +// API messages in the mock adapter and integration tests. +package binapi + +import ( + "reflect" +) + +const swIfIndexName = "swIfIndex" +const retvalName = "retval" +const replySuffix = "_reply" + +// findFieldOfType finds the field specified by its name in provided message defined as reflect.Type data type. +func findFieldOfType(reply reflect.Type, fieldName string) (reflect.StructField, bool) { + if reply.Kind() == reflect.Struct { + field, found := reply.FieldByName(fieldName) + return field, found + } else if reply.Kind() == reflect.Ptr && reply.Elem().Kind() == reflect.Struct { + field, found := reply.Elem().FieldByName(fieldName) + return field, found + } + return reflect.StructField{}, false +} + +// findFieldOfValue finds the field specified by its name in provided message defined as reflect.Value data type. +func findFieldOfValue(reply reflect.Value, fieldName string) (reflect.Value, bool) { + if reply.Kind() == reflect.Struct { + field := reply.FieldByName(fieldName) + return field, field.IsValid() + } else if reply.Kind() == reflect.Ptr && reply.Elem().Kind() == reflect.Struct { + field := reply.Elem().FieldByName(fieldName) + return field, field.IsValid() + } + return reflect.Value{}, false +} + +// HasSwIfIdx checks whether provided message has the swIfIndex field. +func HasSwIfIdx(msg reflect.Type) bool { + _, found := findFieldOfType(msg, swIfIndexName) + return found +} + +// SetSwIfIdx sets the swIfIndex field of provided message to provided value. +func SetSwIfIdx(msg reflect.Value, swIfIndex uint32) { + if field, found := findFieldOfValue(msg, swIfIndexName); found { + field.Set(reflect.ValueOf(swIfIndex)) + } +} + +// SetRetval sets the retval field of provided message to provided value. +func SetRetval(msg reflect.Value, retVal int32) { + if field, found := findFieldOfValue(msg, retvalName); found { + field.Set(reflect.ValueOf(retVal)) + } +} + +// ReplyNameFor returns reply message name to the given request message name. +func ReplyNameFor(requestName string) (string, bool) { + return requestName + replySuffix, true +} |