Generator improvements and cleanup
[govpp.git] / examples / union-example / union_example.go
diff --git a/examples/union-example/union_example.go b/examples/union-example/union_example.go
new file mode 100644 (file)
index 0000000..d4563c6
--- /dev/null
@@ -0,0 +1,103 @@
+// 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"
+       "fmt"
+       "log"
+       "net"
+
+       "git.fd.io/govpp.git/examples/bin_api/ip"
+       "github.com/lunixbochs/struc"
+)
+
+func main() {
+       encodingExample()
+       usageExample()
+}
+
+func encodingExample() {
+       // create union with IPv4 address
+       var unionIP4 ip.AddressUnion
+       unionIP4.SetIP4(ip.IP4Address{192, 168, 1, 10})
+
+       // use it in the Address type
+       addr := &ip.Address{
+               Af: ip.ADDRESS_IP4,
+               Un: ip.AddressUnionIP4(ip.IP4Address{192, 168, 1, 10}),
+       }
+       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
+}
+
+func usageExample() {
+       var convAddr = func(ip string) {
+               addr, err := ipToAddress(ip)
+               if err != nil {
+                       log.Printf("converting ip %q failed: %v", ip, err)
+               }
+               fmt.Printf("% 0X\n", addr)
+       }
+
+       convAddr("10.10.10.10")
+       convAddr("::1")
+       convAddr("")
+}
+
+func ipToAddress(ipstr string) (addr ip.Address, err error) {
+       netIP := net.ParseIP(ipstr)
+       if netIP == nil {
+               return ip.Address{}, fmt.Errorf("invalid IP: %q", ipstr)
+       }
+       if ip4 := netIP.To4(); ip4 == nil {
+               addr.Af = ip.ADDRESS_IP6
+               var ip6addr ip.IP6Address
+               copy(ip6addr[:], netIP.To16())
+               addr.Un.SetIP6(ip6addr)
+       } else {
+               addr.Af = ip.ADDRESS_IP4
+               var ip4addr ip.IP4Address
+               copy(ip4addr[:], ip4)
+               addr.Un.SetIP4(ip4addr)
+       }
+       return
+}