Skip to content

Commit de3bbc1

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

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

transform/canonical.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ 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)
25+
26+
// For backward compatibility
27+
type transformFunc = TransformFunc
2428

2529
var transformers = map[tree.Path]transformFunc{}
2630

transform/defaults.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,23 @@ 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
3132
}
3233

34+
// RegisterDefaultValue registers a custom transformer for the given path pattern
35+
func RegisterDefaultValue(path string, transformer TransformFunc) {
36+
DefaultValues[tree.Path(path)] = transformer
37+
}
38+
39+
3340
// SetDefaultValues transforms a compose model to set default values to missing attributes
3441
func SetDefaultValues(yaml map[string]any) (map[string]any, error) {
3542
result, err := setDefaults(yaml, tree.NewPath())
@@ -40,7 +47,7 @@ func SetDefaultValues(yaml map[string]any) (map[string]any, error) {
4047
}
4148

4249
func setDefaults(data any, p tree.Path) (any, error) {
43-
for pattern, transformer := range defaultValues {
50+
for pattern, transformer := range DefaultValues {
4451
if p.Matches(pattern) {
4552
t, err := transformer(data, p, false)
4653
if err != nil {

transform/ports.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package transform
1818

1919
import (
2020
"fmt"
21-
21+
2222
"github.com/compose-spec/compose-go/v2/tree"
2323
"github.com/compose-spec/compose-go/v2/types"
2424
"github.com/go-viper/mapstructure/v2"

0 commit comments

Comments
 (0)