add json tag support

This commit is contained in:
Carson Krueger 2025-08-03 19:34:31 -06:00
parent d375d06267
commit ba65c2ab0c

View file

@ -6,6 +6,7 @@ import (
"flag"
"fmt"
"os"
"slices"
"strings"
_ "github.com/go-sql-driver/mysql"
@ -17,6 +18,7 @@ import (
postgresgen "github.com/go-jet/jet/v2/generator/postgres"
sqlitegen "github.com/go-jet/jet/v2/generator/sqlite"
"github.com/go-jet/jet/v2/generator/template"
"github.com/go-jet/jet/v2/internal/3rdparty/snaker"
"github.com/go-jet/jet/v2/internal/jet"
"github.com/go-jet/jet/v2/internal/utils/errfmt"
"github.com/go-jet/jet/v2/internal/utils/strslice"
@ -54,6 +56,8 @@ var (
tables string
views string
enums string
modelJsonTag string
)
type templateFilter struct {
@ -93,6 +97,7 @@ func init() {
flag.StringVar(&tablePkg, "rel-table-path", "table", "Relative path for the Table files package from the destination directory.")
flag.StringVar(&viewPkg, "rel-view-path", "view", "Relative path for the View files package from the destination directory.")
flag.StringVar(&enumPkg, "rel-enum-path", "enum", "Relative path for the Enum files package from the destination directory.")
flag.StringVar(&modelJsonTag, "model-json-tag", "", "Json tag model to be included in Go structs. (optional)(default <empty>)(allowed values: <empty>, pascal-case, camel-case, snake-case")
flag.StringVar(&tables, "tables", "", `Comma-separated list of tables to generate.`)
flag.StringVar(&views, "views", "", `Comma-separated list of views to generate.`)
@ -107,6 +112,10 @@ func main() {
printErrorAndExit("ERROR: required flag(s) missing")
}
if !slices.Contains([]string{"", "snake-case", "pascal-case", "camel-case"}, modelJsonTag) {
printErrorAndExit("ERROR: json tag does not contain correct value")
}
source := getSource()
tablesFilter := createTemplateFilter(ignoreTables, tables, "tables")
viewsFilter := createTemplateFilter(ignoreViews, views, "views")
@ -259,8 +268,6 @@ func parseList(list string) []string {
return ret
}
func genTemplate(dialect jet.Dialect, tablesFilter, viewsFilter, enumsFilter templateFilter) template.Template {
return template.Default(dialect).
UseSchema(func(schemaMetaData metadata.Schema) template.Schema {
@ -270,7 +277,22 @@ func genTemplate(dialect jet.Dialect, tablesFilter, viewsFilter, enumsFilter tem
if shouldSkipTable(table, tablesFilter) {
return template.TableModel{Skip: true}
}
return template.DefaultTableModel(table)
return template.DefaultTableModel(table).
UseField(func(columnMetaData metadata.Column) template.TableModelField {
defaultTableModelField := template.DefaultTableModelField(columnMetaData)
var tags []string
switch modelJsonTag {
case "snake-case":
tags = append(tags, fmt.Sprintf(`json:"%s"`, columnMetaData.Name))
case "camel-case":
tags = append(tags, fmt.Sprintf(`json:"%s"`, snaker.SnakeToCamel(columnMetaData.Name, false)))
case "pascal-case":
tags = append(tags, fmt.Sprintf(`json:"%s"`, snaker.SnakeToCamel(columnMetaData.Name, true)))
}
return defaultTableModelField.UseTags(tags...)
})
}).
UseView(func(view metadata.Table) template.ViewModel {
if shouldSkipTable(view, viewsFilter) {