aboutsummaryrefslogtreecommitdiffstats
path: root/binapigen
diff options
context:
space:
mode:
authorOndrej Fabry <ofabry@cisco.com>2020-10-23 11:40:18 +0200
committerOndrej Fabry <ofabry@cisco.com>2020-10-30 10:00:00 +0000
commit0f46871b4cc45f2c3bd5bdb0aa0f7615795a2c6d (patch)
tree3d3de8febc3e2becfbbbd648538fc5dd1748374f /binapigen
parentcb540dc166c12180adba024d5b8fd463d2582928 (diff)
Fix encoding for float64 and generate conversion for Timestamp
- fixes encoding/decoding of float64 - uses little endian (contrary to all other types) - generates helper methods for vpe_types.Timestamp type - adds usage code to simple-client and binapi-types examples Change-Id: I2e83eee0629eb67964049406c50c7ee0a692ccaf Signed-off-by: Ondrej Fabry <ofabry@cisco.com>
Diffstat (limited to 'binapigen')
-rw-r--r--binapigen/gen_helpers.go47
-rw-r--r--binapigen/gen_helpers_test.go27
-rw-r--r--binapigen/generate.go2
3 files changed, 69 insertions, 7 deletions
diff --git a/binapigen/gen_helpers.go b/binapigen/gen_helpers.go
index 5eafc76..944bfe2 100644
--- a/binapigen/gen_helpers.go
+++ b/binapigen/gen_helpers.go
@@ -22,6 +22,7 @@ func init() {
const (
fmtPkg = GoImportPath("fmt")
netPkg = GoImportPath("net")
+ timePkg = GoImportPath("time")
stringsPkg = GoImportPath("strings")
)
@@ -185,13 +186,6 @@ func genIPPrefixConversion(g *GenFile, structName string, ipv int) {
g.P("func (x ", structName, ") String() string {")
g.P(" ip := x.Address.String()")
g.P(" return ip + \"/\" + ", strconvPkg.Ident("Itoa"), "(int(x.Len))")
- /*if ipv == 4 {
- g.P(" mask := ", netPkg.Ident("CIDRMask"), "(int(x.Len), 32)")
- } else {
- g.P(" mask := ", netPkg.Ident("CIDRMask"), "(int(x.Len), 128)")
- }
- g.P(" ipnet := &", netPkg.Ident("IPNet"), "{IP: x.Address.ToIP(), Mask: mask}")
- g.P(" return ipnet.String()")*/
g.P("}")
// MarshalText method
@@ -346,3 +340,42 @@ func genMacAddressConversion(g *GenFile, structName string) {
g.P("}")
g.P()
}
+
+func genTimestampConversion(g *GenFile, structName string) {
+ // NewTimestamp method
+ g.P("func New", structName, "(t ", timePkg.Ident("Time"), ") ", structName, " {")
+ g.P(" sec := int64(t.Unix())")
+ g.P(" nsec := int32(t.Nanosecond())")
+ g.P(" ns := float64(sec) + float64(nsec / 1e9)")
+ g.P(" return ", structName, "(ns)")
+ g.P("}")
+
+ // ToTime method
+ g.P("func (x ", structName, ") ToTime() ", timePkg.Ident("Time"), " {")
+ g.P(" ns := int64(x * 1e9)")
+ g.P(" sec := ns / 1e9")
+ g.P(" nsec := ns % 1e9")
+ g.P(" return ", timePkg.Ident("Unix"), "(sec, nsec)")
+ g.P("}")
+
+ // String method
+ g.P("func (x ", structName, ") String() string {")
+ g.P(" return x.ToTime().String()")
+ g.P("}")
+
+ // MarshalText method
+ g.P("func (x *", structName, ") MarshalText() ([]byte, error) {")
+ g.P(" return []byte(x.ToTime().Format(", timePkg.Ident("RFC3339Nano"), ")), nil")
+ g.P("}")
+
+ // UnmarshalText method
+ g.P("func (x *", structName, ") UnmarshalText(text []byte) error {")
+ g.P(" t, err := ", timePkg.Ident("Parse"), "(", timePkg.Ident("RFC3339Nano"), ", string(text))")
+ g.P(" if err != nil {")
+ g.P(" return err")
+ g.P(" }")
+ g.P(" *x = New", structName, "(t)")
+ g.P(" return nil")
+ g.P("}")
+ g.P()
+}
diff --git a/binapigen/gen_helpers_test.go b/binapigen/gen_helpers_test.go
index 371fd6c..075dd8e 100644
--- a/binapigen/gen_helpers_test.go
+++ b/binapigen/gen_helpers_test.go
@@ -17,11 +17,13 @@ package binapigen
import (
"strings"
"testing"
+ "time"
. "github.com/onsi/gomega"
"git.fd.io/govpp.git/binapi/ethernet_types"
"git.fd.io/govpp.git/binapi/ip_types"
+ "git.fd.io/govpp.git/binapi/vpe_types"
)
func TestGeneratedParseAddress(t *testing.T) {
@@ -154,3 +156,28 @@ func TestGeneratedParseMACError(t *testing.T) {
_, err := ethernet_types.ParseMacAddress("malformed_mac")
Expect(err).Should(HaveOccurred())
}
+
+func TestGeneratedParseTimestamp(t *testing.T) {
+ RegisterTestingT(t)
+
+ var data = []struct {
+ input time.Time
+ result vpe_types.Timestamp
+ }{
+ {time.Unix(0, 0), vpe_types.Timestamp(0)},
+ {time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
+ vpe_types.Timestamp(9.466848e+08)},
+ }
+
+ for _, entry := range data {
+ t.Run(entry.input.String(), func(t *testing.T) {
+ ts := vpe_types.NewTimestamp(entry.input)
+ Expect(ts).To(Equal(entry.result))
+
+ Expect(entry.input.Equal(ts.ToTime())).To(BeTrue())
+
+ originTime := ts.String()
+ Expect(originTime).To(Equal(entry.input.Local().String()))
+ })
+ }
+}
diff --git a/binapigen/generate.go b/binapigen/generate.go
index 834c989..bf6df81 100644
--- a/binapigen/generate.go
+++ b/binapigen/generate.go
@@ -246,6 +246,8 @@ func genAlias(g *GenFile, alias *Alias) {
genAddressWithPrefixConversion(g, alias.GoName)
case "mac_address":
genMacAddressConversion(g, alias.GoName)
+ case "timestamp":
+ genTimestampConversion(g, alias.GoName)
}
}