Skip to content

Commit c153775

Browse files
committed
feat: add extensible transform API for custom field transformations
Signed-off-by: Evgenii Orlov <[email protected]>
1 parent 8da9902 commit c153775

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

transform/canonical.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ import (
2020
"github.com/compose-spec/compose-go/v2/tree"
2121
)
2222

23-
type transformFunc func(data any, p tree.Path, ignoreParseError bool) (any, error)
23+
// TransformFunc is a function that can transform data at a specific path
24+
type TransformFunc func(data any, p tree.Path, ignoreParseError bool) (any, error)
2425

25-
var transformers = map[tree.Path]transformFunc{}
26+
var transformers = map[tree.Path]TransformFunc{}
2627

2728
func init() {
2829
transformers["services.*"] = transformService

transform/defaults.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,20 @@ import (
2020
"github.com/compose-spec/compose-go/v2/tree"
2121
)
2222

23-
var defaultValues = map[tree.Path]transformFunc{}
23+
// DefaultValues contains the default value transformers for compose fields
24+
var DefaultValues = map[tree.Path]TransformFunc{}
2425

2526
func init() {
26-
defaultValues["services.*.build"] = defaultBuildContext
27-
defaultValues["services.*.secrets.*"] = defaultSecretMount
28-
defaultValues["services.*.ports.*"] = portDefaults
29-
defaultValues["services.*.deploy.resources.reservations.devices.*"] = deviceRequestDefaults
30-
defaultValues["services.*.gpus.*"] = deviceRequestDefaults
27+
DefaultValues["services.*.build"] = defaultBuildContext
28+
DefaultValues["services.*.secrets.*"] = defaultSecretMount
29+
DefaultValues["services.*.ports.*"] = portDefaults
30+
DefaultValues["services.*.deploy.resources.reservations.devices.*"] = deviceRequestDefaults
31+
DefaultValues["services.*.gpus.*"] = deviceRequestDefaults
32+
}
33+
34+
// RegisterDefaultValue registers a custom transformer for the given path pattern
35+
func RegisterDefaultValue(path string, transformer TransformFunc) {
36+
DefaultValues[tree.Path(path)] = transformer
3137
}
3238

3339
// SetDefaultValues transforms a compose model to set default values to missing attributes
@@ -40,7 +46,7 @@ func SetDefaultValues(yaml map[string]any) (map[string]any, error) {
4046
}
4147

4248
func setDefaults(data any, p tree.Path) (any, error) {
43-
for pattern, transformer := range defaultValues {
49+
for pattern, transformer := range DefaultValues {
4450
if p.Matches(pattern) {
4551
t, err := transformer(data, p, false)
4652
if err != nil {

0 commit comments

Comments
 (0)