diff options
author | 2020-10-23 11:40:18 +0200 | |
---|---|---|
committer | 2020-10-30 10:00:00 +0000 | |
commit | 0f46871b4cc45f2c3bd5bdb0aa0f7615795a2c6d (patch) | |
tree | 3d3de8febc3e2becfbbbd648538fc5dd1748374f /binapigen | |
parent | cb540dc166c12180adba024d5b8fd463d2582928 (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.go | 47 | ||||
-rw-r--r-- | binapigen/gen_helpers_test.go | 27 | ||||
-rw-r--r-- | binapigen/generate.go | 2 |
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) } } |