aboutsummaryrefslogtreecommitdiffstats
path: root/examples/cmd/union-example/union_example.go
diff options
context:
space:
mode:
Diffstat (limited to 'examples/cmd/union-example/union_example.go')
-rw-r--r--examples/cmd/union-example/union_example.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/examples/cmd/union-example/union_example.go b/examples/cmd/union-example/union_example.go
new file mode 100644
index 0000000..bb6c8a1
--- /dev/null
+++ b/examples/cmd/union-example/union_example.go
@@ -0,0 +1,63 @@
+// Copyright (c) 2018 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.
+
+// union-example is an example to show how to use unions in VPP binary API.
+package main
+
+import (
+ "bytes"
+ "log"
+
+ "git.fd.io/govpp.git/examples/bin_api/ip"
+ "github.com/lunixbochs/struc"
+)
+
+func main() {
+ // create union with IPv4 address
+ var unionIP4 ip.AddressUnion
+ unionIP4.SetIP4(ip.IP4Address{Address: []byte{192, 168, 1, 10}})
+
+ // use it in the Address type
+ addr := &ip.Address{
+ Af: ip.ADDRESS_IP4,
+ Un: unionIP4,
+ }
+ log.Printf("encoding union IPv4: %v", addr.Un.GetIP4())
+
+ // encode the address with union
+ data := encode(addr)
+ // decode the address with union
+ addr2 := decode(data)
+
+ log.Printf("decoded union IPv4: %v", addr2.Un.GetIP4())
+}
+
+func encode(addr *ip.Address) []byte {
+ log.Printf("encoding address: %#v", addr)
+ buf := new(bytes.Buffer)
+ if err := struc.Pack(buf, addr); err != nil {
+ panic(err)
+ }
+ return buf.Bytes()
+}
+
+func decode(data []byte) *ip.Address {
+ addr := new(ip.Address)
+ buf := bytes.NewReader(data)
+ if err := struc.Unpack(buf, addr); err != nil {
+ panic(err)
+ }
+ log.Printf("decoded address: %#v", addr)
+ return addr
+}