Recognize stat_dir_type_empty
[govpp.git] / binapigen / gen_helpers.go
index a22f1c6..944bfe2 100644 (file)
@@ -22,10 +22,11 @@ func init() {
 const (
        fmtPkg     = GoImportPath("fmt")
        netPkg     = GoImportPath("net")
+       timePkg    = GoImportPath("time")
        stringsPkg = GoImportPath("strings")
 )
 
-func generateIPConversion(g *GenFile, structName string, ipv int) {
+func genIPConversion(g *GenFile, structName string, ipv int) {
        // ParseIPXAddress method
        g.P("func Parse", structName, "(s string) (", structName, ", error) {")
        if ipv == 4 {
@@ -77,7 +78,7 @@ func generateIPConversion(g *GenFile, structName string, ipv int) {
        g.P()
 }
 
-func generateAddressConversion(g *GenFile, structName string) {
+func genAddressConversion(g *GenFile, structName string) {
        // ParseAddress method
        g.P("func Parse", structName, "(s string) (", structName, ", error) {")
        g.P("   ip := ", netPkg.Ident("ParseIP"), "(s)")
@@ -132,7 +133,7 @@ func generateAddressConversion(g *GenFile, structName string) {
        g.P()
 }
 
-func generateIPPrefixConversion(g *GenFile, structName string, ipv int) {
+func genIPPrefixConversion(g *GenFile, structName string, ipv int) {
        // ParsePrefix method
        g.P("func Parse", structName, "(s string) (prefix ", structName, ", err error) {")
        g.P("   hasPrefix := ", stringsPkg.Ident("Contains"), "(s, \"/\")")
@@ -185,13 +186,6 @@ func generateIPPrefixConversion(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
@@ -211,7 +205,7 @@ func generateIPPrefixConversion(g *GenFile, structName string, ipv int) {
        g.P()
 }
 
-func generatePrefixConversion(g *GenFile, structName string) {
+func genPrefixConversion(g *GenFile, structName string) {
        // ParsePrefix method
        g.P("func Parse", structName, "(ip string) (prefix ", structName, ", err error) {")
        g.P("   hasPrefix := ", stringsPkg.Ident("Contains"), "(ip, \"/\")")
@@ -276,7 +270,7 @@ func generatePrefixConversion(g *GenFile, structName string) {
        g.P()
 }
 
-func generateAddressWithPrefixConversion(g *GenFile, structName string) {
+func genAddressWithPrefixConversion(g *GenFile, structName string) {
        // ParseAddressWithPrefix method
        g.P("func Parse", structName, "(s string) (", structName, ", error) {")
        g.P("   prefix, err := ParsePrefix(s)")
@@ -308,7 +302,7 @@ func generateAddressWithPrefixConversion(g *GenFile, structName string) {
        g.P()
 }
 
-func generateMacAddressConversion(g *GenFile, structName string) {
+func genMacAddressConversion(g *GenFile, structName string) {
        // ParseMAC method
        g.P("func Parse", structName, "(s string) (", structName, ", error) {")
        g.P("   var macaddr ", structName)
@@ -346,3 +340,42 @@ func generateMacAddressConversion(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()
+}