# HG changeset patch # User Florent Aide <florent.aide@gmail.com> # Date 1632341736 -7200 # Wed Sep 22 22:15:36 2021 +0200 # Node ID a24a188961cef84ecee1da543b92e227619c74da # Parent 6634e1f0eaacd1a2e8682e30603a433583c6b27b add template for restapi/version.go, injection thx to christophe de vienne diff --git a/server.yaml b/server.yaml --- a/server.yaml +++ b/server.yaml @@ -72,6 +72,10 @@ target: "{{ joinFilePath .Target .ServerPackage }}" file_name: "configure_{{ .Name }}.go" skip_exists: true + - name: version + source: server/versionapi.gotmpl + target: "{{ joinFilePath .Target .ServerPackage }}" + file_name: version.go models: # built-in templates diff --git a/templates/server/cmd.gotmpl b/templates/server/cmd.gotmpl --- a/templates/server/cmd.gotmpl +++ b/templates/server/cmd.gotmpl @@ -9,7 +9,7 @@ ) var ( - Version string + Version = restapi.GetVersion() ) type ConfigFile struct { diff --git a/templates/server/versionapi.gotmpl b/templates/server/versionapi.gotmpl new file mode 100644 --- /dev/null +++ b/templates/server/versionapi.gotmpl @@ -0,0 +1,31 @@ +// This file is safe to edit. Once it exists it will not be overwritten + +{{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }} + + +package {{ .APIPackage }} + +import ( + "encoding/json" + + {{ imports .DefaultImports }} + {{ imports .Imports }} +) + +var ( + VCSCommit string + VersionTag = "dev" + injectVersion = orusapi.InjectVersion(VersionTag, VCSCommit) +) + +func GetSwaggerJSON() json.RawMessage { + return injectVersion(SwaggerJSON) +} + +func GetFlatSwaggerJSON() json.RawMessage { + return injectVersion(FlatSwaggerJSON) +} + +func GetVersion() string { + return orusapi.GetVersion(GetSwaggerJSON()) +} diff --git a/version.go b/version.go new file mode 100644 --- /dev/null +++ b/version.go @@ -0,0 +1,44 @@ +package orusapi + +import ( + "encoding/json" + "regexp" +) + +var versionAttrRe = regexp.MustCompile(`"version": ?"[0-9.]+"`) + +func JSONFixVersionAttribute(versionTag, vcsCommit string) func(data []byte) []byte { + return func(data []byte) []byte { + if versionTag == "" { + return data + } + s := string(data[:len(data)-1]) + "-" + versionTag + if vcsCommit != "" { + s += "." + vcsCommit + } + s += `"` + + return []byte(s) + } +} + +func InjectVersion(versionTag, vcsCommit string) func(json.RawMessage) json.RawMessage { + jsonFixVersionAttribute := JSONFixVersionAttribute(versionTag, vcsCommit) + return func(swaggerJSON json.RawMessage) json.RawMessage { + return versionAttrRe.ReplaceAllFunc(swaggerJSON, jsonFixVersionAttribute) + } +} + +type swaggerVersion struct { + Info struct { + Version string + } +} + +func GetVersion(swaggerJSON json.RawMessage) string { + var sv swaggerVersion + if err := json.Unmarshal(swaggerJSON, &sv); err != nil { + panic(err) + } + return sv.Info.Version +}