Skip to content

Commit 5aeba0e

Browse files
authored
feat: Add WithResolverTransformer (#578)
For some plugins it's useful to configure a resolver based on the field's type: https://github.com/cloudquery/cloudquery/blob/876cc163d6dff277bb09a5147162a8646fcd98de/plugins/source/gcp/codegen/main.go#L263 I don't use the default one from `codegen` package like others as it returns `(string, error)` and we want to return a `schema.ColumnResolver` instead ---
1 parent f836abd commit 5aeba0e

1 file changed

Lines changed: 25 additions & 1 deletion

File tree

transformers/struct.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

2425
type 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+
2633
type IgnoreInTestsTransformer func(field reflect.StructField) bool
2734

2835
func 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.
7483
func 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.
8299
func 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

Comments
 (0)