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
0 commit comments