Change module name to go.fd.io/govpp
[govpp.git] / binapigen / generate.go
index 834c989..2be33d1 100644 (file)
@@ -21,15 +21,15 @@ import (
        "strconv"
        "strings"
 
-       "git.fd.io/govpp.git/internal/version"
+       "go.fd.io/govpp/version"
 )
 
 // library dependencies
 const (
        strconvPkg = GoImportPath("strconv")
 
-       govppApiPkg   = GoImportPath("git.fd.io/govpp.git/api")
-       govppCodecPkg = GoImportPath("git.fd.io/govpp.git/codec")
+       govppApiPkg   = GoImportPath("go.fd.io/govpp/api")
+       govppCodecPkg = GoImportPath("go.fd.io/govpp/codec")
 )
 
 // generated names
@@ -41,6 +41,19 @@ const (
        fieldUnionData = "XXX_UnionData" // name for the union data field
 )
 
+// option keys
+const (
+       msgStatus     = "status"
+       msgDeprecated = "deprecated"
+       msgInProgress = "in_progress"
+)
+
+// generated option messages
+const (
+       deprecatedMsg = "the message will be removed in the future versions"
+       inProgressMsg = "the message form may change in the future versions"
+)
+
 func GenerateAPI(gen *Generator, file *File) *GenFile {
        logf("----------------------------")
        logf(" Generate API - %s", file.Desc.Name)
@@ -77,14 +90,12 @@ func GenerateAPI(gen *Generator, file *File) *GenFile {
        g.P("const _ = ", govppApiPkg.Ident("GoVppAPIPackageIsVersion"), generatedCodeVersion)
        g.P()
 
-       if !file.isTypesFile() {
-               g.P("const (")
-               g.P(apiName, " = ", strconv.Quote(g.file.Desc.Name))
-               g.P(apiVersion, " = ", strconv.Quote(g.file.Version))
-               g.P(apiCrc, " = ", g.file.Desc.CRC)
-               g.P(")")
-               g.P()
-       }
+       g.P("const (")
+       g.P(apiName, " = ", strconv.Quote(g.file.Desc.Name))
+       g.P(apiVersion, " = ", strconv.Quote(g.file.Version))
+       g.P(apiCrc, " = ", g.file.Desc.CRC)
+       g.P(")")
+       g.P()
 
        for _, enum := range g.file.Enums {
                genEnum(g, enum)
@@ -145,6 +156,23 @@ func genTypeComment(g *GenFile, goName string, vppName string, objKind string) {
        g.P("// ", goName, " defines ", objKind, " '", vppName, "'.")
 }
 
+func genTypeOptionComment(g *GenFile, options map[string]string) {
+       // all messages for API versions < 1.0.0 are in_progress by default
+       if msg, ok := options[msgInProgress]; ok || options[msgStatus] == msgInProgress ||
+               len(g.file.Version) > 1 && g.file.Version[0:2] == "0." {
+               if msg == "" {
+                       msg = inProgressMsg
+               }
+               g.P("// InProgress: ", msg)
+       }
+       if msg, ok := options[msgDeprecated]; ok || options[msgStatus] == msgDeprecated {
+               if msg == "" {
+                       msg = deprecatedMsg
+               }
+               g.P("// Deprecated: ", msg)
+       }
+}
+
 func genEnum(g *GenFile, enum *Enum) {
        logf("gen ENUM %s (%s) - %d entries", enum.GoName, enum.Name, len(enum.Entries))
 
@@ -178,7 +206,7 @@ func genEnum(g *GenFile, enum *Enum) {
        g.P(")")
        g.P()
 
-       if isEnumFlag(enum) {
+       if enum.IsFlag || isEnumFlag(enum) {
                size := BaseTypeSizes[enum.Type] * 8
                g.P("func (x ", enum.GoName, ") String() string {")
                g.P("   s, ok := ", enum.GoName, "_name[", gotype, "(x)]")
@@ -246,6 +274,8 @@ func genAlias(g *GenFile, alias *Alias) {
                genAddressWithPrefixConversion(g, alias.GoName)
        case "mac_address":
                genMacAddressConversion(g, alias.GoName)
+       case "timestamp":
+               genTimestampConversion(g, alias.GoName)
        }
 }
 
@@ -451,6 +481,7 @@ func genMessage(g *GenFile, msg *Message) {
        logf("gen MESSAGE %s (%s) - %d fields", msg.GoName, msg.Name, len(msg.Fields))
 
        genTypeComment(g, msg.GoIdent.GoName, msg.Name, "message")
+       genTypeOptionComment(g, msg.Options)
 
        // generate message definition
        if len(msg.Fields) == 0 {