2023-01-09 04:05:25 -06:00
|
|
|
package differ
|
|
|
|
|
2023-01-09 07:45:35 -06:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
2023-01-09 09:49:35 -06:00
|
|
|
"github.com/zclconf/go-cty/cty"
|
|
|
|
|
2023-01-09 07:45:35 -06:00
|
|
|
"github.com/hashicorp/terraform/internal/command/jsonformat/change"
|
|
|
|
"github.com/hashicorp/terraform/internal/plans"
|
|
|
|
)
|
|
|
|
|
2023-01-09 04:05:25 -06:00
|
|
|
func (v Value) ComputeChangeForOutput() change.Change {
|
2023-01-09 13:38:25 -06:00
|
|
|
if sensitive, ok := v.checkForSensitiveType(cty.DynamicPseudoType); ok {
|
2023-01-09 09:49:35 -06:00
|
|
|
return sensitive
|
|
|
|
}
|
|
|
|
|
|
|
|
if computed, ok := v.checkForComputedType(cty.DynamicPseudoType); ok {
|
|
|
|
return computed
|
|
|
|
}
|
|
|
|
|
2023-01-09 07:45:35 -06:00
|
|
|
beforeType := getJsonType(v.Before)
|
|
|
|
afterType := getJsonType(v.After)
|
|
|
|
|
2023-01-09 10:15:17 -06:00
|
|
|
valueToAttribute := func(v Value, jsonType JsonType) change.Change {
|
2023-01-09 07:45:35 -06:00
|
|
|
var res change.Change
|
|
|
|
|
|
|
|
switch jsonType {
|
|
|
|
case jsonNull:
|
|
|
|
res = v.computeAttributeChangeAsPrimitive(cty.NilType)
|
|
|
|
case jsonBool:
|
|
|
|
res = v.computeAttributeChangeAsPrimitive(cty.Bool)
|
|
|
|
case jsonString:
|
|
|
|
res = v.computeAttributeChangeAsPrimitive(cty.String)
|
|
|
|
case jsonNumber:
|
|
|
|
res = v.computeAttributeChangeAsPrimitive(cty.Number)
|
|
|
|
case jsonObject:
|
2023-01-09 09:49:35 -06:00
|
|
|
res = v.computeAttributeChangeAsMap(cty.DynamicPseudoType)
|
2023-01-09 07:45:35 -06:00
|
|
|
case jsonArray:
|
2023-01-09 09:49:35 -06:00
|
|
|
res = v.computeAttributeChangeAsList(cty.DynamicPseudoType)
|
2023-01-09 07:45:35 -06:00
|
|
|
default:
|
|
|
|
panic("unrecognized json type: " + jsonType)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
if beforeType == afterType || (beforeType == jsonNull || afterType == jsonNull) {
|
|
|
|
targetType := beforeType
|
|
|
|
if targetType == jsonNull {
|
|
|
|
targetType = afterType
|
|
|
|
}
|
|
|
|
return valueToAttribute(v, targetType)
|
|
|
|
}
|
|
|
|
|
|
|
|
before := valueToAttribute(Value{
|
|
|
|
Before: v.Before,
|
|
|
|
BeforeSensitive: v.BeforeSensitive,
|
|
|
|
}, beforeType)
|
|
|
|
|
|
|
|
after := valueToAttribute(Value{
|
|
|
|
After: v.After,
|
|
|
|
AfterSensitive: v.AfterSensitive,
|
|
|
|
Unknown: v.Unknown,
|
|
|
|
}, afterType)
|
|
|
|
|
|
|
|
return change.New(change.TypeChange(before, after), plans.Update, false)
|
|
|
|
}
|
|
|
|
|
2023-01-09 10:15:17 -06:00
|
|
|
func getJsonType(json interface{}) JsonType {
|
2023-01-09 07:45:35 -06:00
|
|
|
switch json.(type) {
|
|
|
|
case []interface{}:
|
|
|
|
return jsonArray
|
|
|
|
case float64:
|
|
|
|
return jsonNumber
|
|
|
|
case string:
|
|
|
|
return jsonString
|
|
|
|
case bool:
|
|
|
|
return jsonBool
|
|
|
|
case nil:
|
|
|
|
return jsonNull
|
|
|
|
case map[string]interface{}:
|
|
|
|
return jsonObject
|
|
|
|
default:
|
|
|
|
panic(fmt.Sprintf("unrecognized json type %T", json))
|
|
|
|
}
|
2023-01-09 04:05:25 -06:00
|
|
|
}
|