# 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
+}