@@ -14,6 +14,7 @@ type structTransformer struct {
1414 skipFields []string
1515 nameTransformer NameTransformer
1616 typeTransformer TypeTransformer
17+ resolverTransformer ResolverTransformer
1718 ignoreInTestsTransformer IgnoreInTestsTransformer
1819 unwrapAllEmbeddedStructFields bool
1920 structFieldsToUnwrap []string
@@ -23,6 +24,12 @@ type NameTransformer func(reflect.StructField) (string, error)
2324
2425type TypeTransformer func (reflect.StructField ) (schema.ValueType , error )
2526
27+ type ResolverTransformer func (field reflect.StructField , path string ) schema.ColumnResolver
28+
29+ func DefaultResolverTransformer (_ reflect.StructField , path string ) schema.ColumnResolver {
30+ return schema .PathResolver (path )
31+ }
32+
2633type IgnoreInTestsTransformer func (field reflect.StructField ) bool
2734
2835func DefaultIgnoreInTestsTransformer (_ reflect.StructField ) bool {
@@ -71,12 +78,22 @@ func WithNameTransformer(transformer NameTransformer) StructTransformerOption {
7178 }
7279}
7380
81+ // WithTypeTransformer overrides how column type will be determined.
82+ // DefaultTypeTransformer is used as the default.
7483func WithTypeTransformer (transformer TypeTransformer ) StructTransformerOption {
7584 return func (t * structTransformer ) {
7685 t .typeTransformer = transformer
7786 }
7887}
7988
89+ // WithResolverTransformer overrides how column resolver will be determined.
90+ // DefaultResolverTransformer is used as the default.
91+ func WithResolverTransformer (transformer ResolverTransformer ) StructTransformerOption {
92+ return func (t * structTransformer ) {
93+ t .resolverTransformer = transformer
94+ }
95+ }
96+
8097// WithIgnoreInTestsTransformer overrides how column ignoreInTests will be determined.
8198// DefaultIgnoreInTestsTransformer is used as the default.
8299func WithIgnoreInTestsTransformer (transformer IgnoreInTestsTransformer ) StructTransformerOption {
@@ -89,6 +106,7 @@ func TransformWithStruct(st any, opts ...StructTransformerOption) schema.Transfo
89106 t := & structTransformer {
90107 nameTransformer : codegen .DefaultNameTransformer ,
91108 typeTransformer : codegen .DefaultTypeTransformer ,
109+ resolverTransformer : DefaultResolverTransformer ,
92110 ignoreInTestsTransformer : DefaultIgnoreInTestsTransformer ,
93111 }
94112 for _ , opt := range opts {
@@ -223,11 +241,17 @@ func (t *structTransformer) addColumnFromField(field reflect.StructField, parent
223241 if t .table .Columns .Get (name ) != nil {
224242 return nil
225243 }
244+
245+ resolver := t .resolverTransformer (field , path )
246+ if resolver == nil {
247+ resolver = DefaultResolverTransformer (field , path )
248+ }
249+
226250 t .table .Columns = append (t .table .Columns ,
227251 schema.Column {
228252 Name : name ,
229253 Type : columnType ,
230- Resolver : schema . PathResolver ( path ) ,
254+ Resolver : resolver ,
231255 IgnoreInTests : t .ignoreInTestsTransformer (field ),
232256 },
233257 )
0 commit comments