mirror of https://github.com/databricks/cli.git
67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package mutator
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/databricks/cli/bundle"
|
|
"github.com/databricks/cli/libs/diag"
|
|
"github.com/databricks/cli/libs/dyn"
|
|
)
|
|
|
|
type environmentsToTargets struct{}
|
|
|
|
func EnvironmentsToTargets() bundle.Mutator {
|
|
return &environmentsToTargets{}
|
|
}
|
|
|
|
func (m *environmentsToTargets) Name() string {
|
|
return "EnvironmentsToTargets"
|
|
}
|
|
|
|
func (m *environmentsToTargets) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnostics {
|
|
// Short circuit if the "environments" key is not set.
|
|
// This is the common case.
|
|
if b.Config.Environments == nil {
|
|
return nil
|
|
}
|
|
|
|
// The "environments" key is set; validate and rewrite it to "targets".
|
|
err := b.Config.Mutate(func(v dyn.Value) (dyn.Value, error) {
|
|
environments := v.Get("environments")
|
|
targets := v.Get("targets")
|
|
|
|
// Return an error if both "environments" and "targets" are set.
|
|
if environments.Kind() != dyn.KindInvalid && targets.Kind() != dyn.KindInvalid {
|
|
return dyn.InvalidValue, fmt.Errorf(
|
|
"both 'environments' and 'targets' are specified; only 'targets' should be used: %s",
|
|
environments.Location().String(),
|
|
)
|
|
}
|
|
|
|
// Rewrite "environments" to "targets".
|
|
if environments.Kind() != dyn.KindInvalid && targets.Kind() == dyn.KindInvalid {
|
|
nv, err := dyn.Set(v, "targets", environments)
|
|
if err != nil {
|
|
return dyn.InvalidValue, err
|
|
}
|
|
// Drop the "environments" key.
|
|
return dyn.Walk(nv, func(p dyn.Path, v dyn.Value) (dyn.Value, error) {
|
|
switch len(p) {
|
|
case 0:
|
|
return v, nil
|
|
case 1:
|
|
if p[0] == dyn.Key("environments") {
|
|
return v, dyn.ErrDrop
|
|
}
|
|
}
|
|
return v, dyn.ErrSkip
|
|
})
|
|
}
|
|
|
|
return v, nil
|
|
})
|
|
|
|
return diag.FromErr(err)
|
|
}
|