File: dbmodel.go

package info (click to toggle)
golang-github-ovn-org-libovsdb 0.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, forky, sid, trixie
  • size: 1,440 kB
  • sloc: makefile: 52; sh: 14
file content (106 lines) | stat: -rw-r--r-- 2,739 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package modelgen

import (
	"encoding/json"
	"sort"
	"text/template"

	"github.com/ovn-org/libovsdb/ovsdb"
)

// NewDBTemplate returns a new ClientDBModel template. It includes the following
// other templates that can be overridden to customize the generated file:
//
//   - `header`: to include a comment as a header before package definition
//   - `preDBDefinitions`: to include code after package definition
//   - `postDBDefinitions`: to include code at the end
//
// It is designed to be used with a map[string] interface and some defined keys
// (see GetDBTemplateData)
func NewDBTemplate() *template.Template {
	return template.Must(template.New("").Funcs(
		template.FuncMap{
			"escape": escape,
		},
	).Parse(`
{{- define "header" }}
// Code generated by "libovsdb.modelgen"
// DO NOT EDIT.
{{- end }}
{{- define "preDBDefinitions" }}
 import (
	"encoding/json"

	"github.com/ovn-org/libovsdb/model"
	"github.com/ovn-org/libovsdb/ovsdb"
)
{{- end }}
{{ define "postDBDefinitions" }}{{ end }}
{{ template "header" . }}

package {{ index . "PackageName" }}

{{ template "preDBDefinitions" }}

// FullDatabaseModel returns the DatabaseModel object to be used in libovsdb
func FullDatabaseModel() (model.ClientDBModel, error) {
	return model.NewClientDBModel("{{ index . "DatabaseName" }}", map[string]model.Model{
    {{ range index . "Tables" }} "{{ .TableName }}" : &{{ .StructName }}{}, 
    {{ end }}
	})
}

var schema = {{ index . "Schema" | escape }}

func Schema() ovsdb.DatabaseSchema {
	var s ovsdb.DatabaseSchema
	err := json.Unmarshal([]byte(schema), &s)
	if err != nil {
		panic(err)
	}
	return s
}

{{ template "postDBDefinitions" . }}
`))
}

// TableInfo represents the information of a table needed by the Model template
type TableInfo struct {
	TableName  string
	StructName string
}

// GetDBTemplateData returns the map needed to execute the DBTemplate. It has
// the following keys:
//
//   - `DatabaseName`: (string) the database name
//   - `PackageName`: (string) the package name
//   - `Tables`: []Table list of Tables that form the Model
func GetDBTemplateData(pkg string, schema ovsdb.DatabaseSchema) map[string]interface{} {
	data := map[string]interface{}{}
	data["DatabaseName"] = schema.Name
	data["PackageName"] = pkg
	schemaBytes, _ := json.MarshalIndent(schema, "", "  ")
	data["Schema"] = string(schemaBytes)
	tables := []TableInfo{}

	var order sort.StringSlice
	for tableName := range schema.Tables {
		order = append(order, tableName)
	}
	order.Sort()

	for _, tableName := range order {
		tables = append(tables, TableInfo{
			TableName:  tableName,
			StructName: StructName(tableName),
		})
	}
	data["Tables"] = tables
	return data
}

func escape(s string) string {
	return "`" + s + "`"
}