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 + "`"
}
|