From ba65c2ab0cf7d336e26fe6d405b646b974611cbb Mon Sep 17 00:00:00 2001 From: Carson Krueger Date: Sun, 3 Aug 2025 19:34:31 -0600 Subject: [PATCH] add json tag support --- cmd/jet/main.go | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/cmd/jet/main.go b/cmd/jet/main.go index 5230bd6..2460d16 100644 --- a/cmd/jet/main.go +++ b/cmd/jet/main.go @@ -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,10 +56,12 @@ var ( tables string views string enums string + + modelJsonTag string ) type templateFilter struct { - names []string + names []string ignore bool } @@ -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 )(allowed values: , 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) { @@ -318,13 +340,13 @@ func createTemplateFilter(ignoreList, allowList, filterType string) templateFilt if allowList != "" { return templateFilter{ - names: parseList(allowList), + names: parseList(allowList), ignore: false, } } return templateFilter{ - names: parseList(ignoreList), + names: parseList(ignoreList), ignore: true, } }