go.mod: Update for go1.18 & bump to go 1.13
[govpp.git] / binapigen / gen_helpers.go
index 5eafc76..0fc303d 100644 (file)
@@ -22,6 +22,7 @@ func init() {
 const (
        fmtPkg     = GoImportPath("fmt")
        netPkg     = GoImportPath("net")
+       timePkg    = GoImportPath("time")
        stringsPkg = GoImportPath("strings")
 )
 
@@ -54,16 +55,19 @@ func genIPConversion(g *GenFile, structName string, ipv int) {
                g.P("   return ", netPkg.Ident("IP"), "(x[:]).To16()")
        }
        g.P("}")
+       g.P()
 
        // String method
        g.P("func (x ", structName, ") String() string {")
        g.P("   return x.ToIP().String()")
        g.P("}")
+       g.P()
 
        // MarshalText method
        g.P("func (x *", structName, ") MarshalText() ([]byte, error) {")
        g.P("   return []byte(x.String()), nil")
        g.P("}")
+       g.P()
 
        // UnmarshalText method
        g.P("func (x *", structName, ") UnmarshalText(text []byte) error {")
@@ -84,6 +88,12 @@ func genAddressConversion(g *GenFile, structName string) {
        g.P("   if ip == nil {")
        g.P("           return ", structName, "{}, ", fmtPkg.Ident("Errorf"), "(\"invalid address: %s\", s)")
        g.P("   }")
+       g.P("   return ", structName, "FromIP(ip), nil")
+       g.P("}")
+       g.P()
+
+       // AddressFromIP method
+       g.P("func ", structName, "FromIP(ip ", netPkg.Ident("IP"), ") ", structName, " {")
        g.P("   var addr ", structName)
        g.P("   if ip.To4() == nil {")
        g.P("           addr.Af = ADDRESS_IP6")
@@ -96,8 +106,9 @@ func genAddressConversion(g *GenFile, structName string) {
        g.P("           copy(ip4[:], ip.To4())")
        g.P("           addr.Un.SetIP4(ip4)")
        g.P("   }")
-       g.P("   return addr, nil")
+       g.P("   return addr")
        g.P("}")
+       g.P()
 
        // ToIP method
        g.P("func (x ", structName, ") ToIP() ", netPkg.Ident("IP"), " {")
@@ -109,16 +120,19 @@ func genAddressConversion(g *GenFile, structName string) {
        g.P("           return ", netPkg.Ident("IP"), "(ip4[:]).To4()")
        g.P("   }")
        g.P("}")
+       g.P()
 
        // String method
        g.P("func (x ", structName, ") String() string {")
        g.P("   return x.ToIP().String()")
        g.P("}")
+       g.P()
 
        // MarshalText method
        g.P("func (x *", structName, ") MarshalText() ([]byte, error) {")
        g.P("   return []byte(x.String()), nil")
        g.P("}")
+       g.P()
 
        // UnmarshalText method
        g.P("func (x *", structName, ") UnmarshalText(text []byte) error {")
@@ -169,6 +183,7 @@ func genIPPrefixConversion(g *GenFile, structName string, ipv int) {
        g.P("   }")
        g.P("   return prefix, nil")
        g.P("}")
+       g.P()
 
        // ToIPNet method
        g.P("func (x ", structName, ") ToIPNet() *", netPkg.Ident("IPNet"), " {")
@@ -180,24 +195,20 @@ func genIPPrefixConversion(g *GenFile, structName string, ipv int) {
        g.P("   ipnet := &", netPkg.Ident("IPNet"), "{IP: x.Address.ToIP(), Mask: mask}")
        g.P("   return ipnet")
        g.P("}")
+       g.P()
 
        // String method
        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("}")
+       g.P()
 
        // MarshalText method
        g.P("func (x *", structName, ") MarshalText() ([]byte, error) {")
        g.P("   return []byte(x.String()), nil")
        g.P("}")
+       g.P()
 
        // UnmarshalText method
        g.P("func (x *", structName, ") UnmarshalText(text []byte) error {")
@@ -240,6 +251,7 @@ func genPrefixConversion(g *GenFile, structName string) {
        g.P("   }")
        g.P("   return prefix, nil")
        g.P("}")
+       g.P()
 
        // ToIPNet method
        g.P("func (x ", structName, ") ToIPNet() *", netPkg.Ident("IPNet"), " {")
@@ -252,17 +264,20 @@ func genPrefixConversion(g *GenFile, structName string) {
        g.P("   ipnet := &", netPkg.Ident("IPNet"), "{IP: x.Address.ToIP(), Mask: mask}")
        g.P("   return ipnet")
        g.P("}")
+       g.P()
 
        // String method
        g.P("func (x ", structName, ") String() string {")
        g.P("   ip := x.Address.String()")
        g.P("   return ip + \"/\" + ", strconvPkg.Ident("Itoa"), "(int(x.Len))")
        g.P("}")
+       g.P()
 
        // MarshalText method
        g.P("func (x *", structName, ") MarshalText() ([]byte, error) {")
        g.P("   return []byte(x.String()), nil")
        g.P("}")
+       g.P()
 
        // UnmarshalText method
        g.P("func (x *", structName, ") UnmarshalText(text []byte) error {")
@@ -285,16 +300,19 @@ func genAddressWithPrefixConversion(g *GenFile, structName string) {
        g.P("   }")
        g.P("   return ", structName, "(prefix), nil")
        g.P("}")
+       g.P()
 
        // String method
        g.P("func (x ", structName, ") String() string {")
        g.P("   return Prefix(x).String()")
        g.P("}")
+       g.P()
 
        // MarshalText method
        g.P("func (x *", structName, ") MarshalText() ([]byte, error) {")
        g.P("   return []byte(x.String()), nil")
        g.P("}")
+       g.P()
 
        // UnmarshalText method
        g.P("func (x *", structName, ") UnmarshalText(text []byte) error {")
@@ -319,21 +337,25 @@ func genMacAddressConversion(g *GenFile, structName string) {
        g.P("   copy(macaddr[:], mac[:])")
        g.P("   return macaddr, nil")
        g.P("}")
+       g.P()
 
        // ToMAC method
        g.P("func (x ", structName, ") ToMAC() ", netPkg.Ident("HardwareAddr"), " {")
        g.P("   return ", netPkg.Ident("HardwareAddr"), "(x[:])")
        g.P("}")
+       g.P()
 
        // String method
        g.P("func (x ", structName, ") String() string {")
        g.P("   return x.ToMAC().String()")
        g.P("}")
+       g.P()
 
        // MarshalText method
        g.P("func (x *", structName, ") MarshalText() ([]byte, error) {")
        g.P("   return []byte(x.String()), nil")
        g.P("}")
+       g.P()
 
        // UnmarshalText method
        g.P("func (x *", structName, ") UnmarshalText(text []byte) error {")
@@ -346,3 +368,46 @@ 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("}")
+       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("}")
+       g.P()
+
+       // String method
+       g.P("func (x ", structName, ") String() string {")
+       g.P("   return x.ToTime().String()")
+       g.P("}")
+       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("}")
+       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()
+}