blob: 56418aaee81a5fe59efd561a913dda0e9646bf8f [file] [log] [blame]
package objchange
import (
"github.com/zclconf/go-cty/cty"
"github.com/hashicorp/terraform/internal/plans"
)
// ActionForChange determines which plans.Action value best describes a
// change from the value given in before to the value given in after.
//
// Because it has no context aside from the values, it can only return the
// basic actions NoOp, Create, Update, and Delete. Other codepaths with
// additional information might make this decision differently, such as by
// using the Replace action instead of the Update action where that makes
// sense.
//
// If the after value is unknown then the action can't be properly decided, and
// so ActionForChange will conservatively return either Create or Update
// depending on whether the before value is null. The before value must always
// be fully known; ActionForChange will panic if it contains any unknown values.
func ActionForChange(before, after cty.Value) plans.Action {
switch {
case !after.IsKnown():
if before.IsNull() {
return plans.Create
}
return plans.Update
case after.IsNull() && before.IsNull():
return plans.NoOp
case after.IsNull() && !before.IsNull():
return plans.Delete
case before.IsNull() && !after.IsNull():
return plans.Create
case after.RawEquals(before):
return plans.NoOp
default:
return plans.Update
}
}