| 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 |
| } |
| } |