Skip to content

Commit 3aa795b

Browse files
authored
feat: Use JSON tag for column name when applicable (#112)
Use JSON tag to define field name when applicable
1 parent 5f848de commit 3aa795b

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

codegen/golang.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"io"
77
"reflect"
8+
"strings"
89
"text/template"
910
"unicode"
1011

@@ -54,9 +55,9 @@ func valueToSchemaType(v reflect.Type) (schema.ValueType, error) {
5455
}
5556
}
5657

57-
func WithNameTransformer(transformer func(string) string) TableOptions {
58+
func WithNameTransformer(transformer func(field reflect.StructField) string) TableOptions {
5859
return func(t *TableDefinition) {
59-
t.Name = transformer(t.Name)
60+
t.nameTransformer = transformer
6061
}
6162
}
6263

@@ -86,7 +87,11 @@ func WithUnwrapAllEmbeddedStructs() TableOptions {
8687
}
8788
}
8889

89-
func defaultTransformer(name string) string {
90+
func defaultTransformer(field reflect.StructField) string {
91+
name := field.Name
92+
if jsonTag := strings.Split(field.Tag.Get("json"), ",")[0]; len(jsonTag) > 0 {
93+
name = jsonTag
94+
}
9095
return strcase.ToSnake(name)
9196
}
9297

@@ -129,7 +134,7 @@ func (t *TableDefinition) ignoreField(field reflect.StructField) bool {
129134
return len(field.Name) == 0 || unicode.IsLower(rune(field.Name[0])) || sliceContains(t.skipFields, field.Name)
130135
}
131136

132-
func (t *TableDefinition) addColumnFromField(field reflect.StructField, parentFieldName string) {
137+
func (t *TableDefinition) addColumnFromField(field reflect.StructField, parent *reflect.StructField) {
133138
if t.ignoreField(field) {
134139
return
135140
}
@@ -142,10 +147,10 @@ func (t *TableDefinition) addColumnFromField(field reflect.StructField, parentFi
142147

143148
// generate a PathResolver to use by default
144149
pathResolver := fmt.Sprintf(`schema.PathResolver("%s")`, field.Name)
145-
name := t.nameTransformer(field.Name)
146-
if parentFieldName != "" {
147-
pathResolver = fmt.Sprintf(`schema.PathResolver("%s.%s")`, parentFieldName, field.Name)
148-
name = t.nameTransformer(parentFieldName) + "_" + name
150+
name := t.nameTransformer(field)
151+
if parent != nil {
152+
pathResolver = fmt.Sprintf(`schema.PathResolver("%s.%s")`, parent.Name, field.Name)
153+
name = t.nameTransformer(*parent) + "_" + name
149154
}
150155

151156
column := ColumnDefinition{
@@ -181,16 +186,16 @@ func NewTableFromStruct(name string, obj interface{}, opts ...TableOptions) (*Ta
181186

182187
if t.shouldUnwrapField(field) {
183188
unwrappedFields := t.getUnwrappedFields(field)
184-
parentFieldName := ""
189+
var parent *reflect.StructField
185190
// For non embedded structs we need to add the parent field name to the path
186191
if !field.Anonymous {
187-
parentFieldName = field.Name
192+
parent = &field
188193
}
189194
for _, f := range unwrappedFields {
190-
t.addColumnFromField(f, parentFieldName)
195+
t.addColumnFromField(f, parent)
191196
}
192197
} else {
193-
t.addColumnFromField(field, "")
198+
t.addColumnFromField(field, nil)
194199
}
195200
}
196201

codegen/golang_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ type testStruct struct {
3131
StringArrayCol []string `json:"string_array_col,omitempty"`
3232
TimeCol time.Time `json:"time_col,omitempty"`
3333
TimePointerCol *time.Time `json:"time_pointer_col,omitempty"`
34+
JSONTAG *string `json:"json_tag"`
35+
NOJSONTAG *string
3436
*embeddedStruct
3537
}
3638

@@ -90,6 +92,16 @@ var expectedColumns = []ColumnDefinition{
9092
Type: schema.TypeTimestamp,
9193
Resolver: `schema.PathResolver("TimePointerCol")`,
9294
},
95+
{
96+
Name: "json_tag",
97+
Type: schema.TypeString,
98+
Resolver: `schema.PathResolver("JSONTAG")`,
99+
},
100+
{
101+
Name: "nojsontag",
102+
Type: schema.TypeString,
103+
Resolver: `schema.PathResolver("NOJSONTAG")`,
104+
},
93105
}
94106

95107
var expectedTestTable = TableDefinition{

codegen/table.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package codegen
22

33
import (
4+
"reflect"
5+
46
"github.com/cloudquery/plugin-sdk/schema"
57
)
68

@@ -20,7 +22,7 @@ type TableDefinition struct {
2022
Multiplex string
2123
PostResourceResolver string
2224
PreResourceResolver string
23-
nameTransformer func(string) string
25+
nameTransformer func(reflect.StructField) string
2426
skipFields []string
2527
extraColumns ColumnDefinitions
2628
structFieldsToUnwrap []string

0 commit comments

Comments
 (0)