mirror of https://github.com/hashicorp/terraform
Add support for outputs in the structured renderer (#32426)
* prep for processing the structured run output * undo unwanted change to a json key * Add skeleton functions and API for refactored renderer * goimports * Fix documentation of the RenderOpts struct * Add rendering functionality for primitives to the structured renderer * add test case for override * Add support for parsing and rendering sensitive values in the renderer * Add support for unknown/computed values in the structured renderer * delete missing unit tests * Add support for object attributes in the structured renderer * goimports * Add support for the replace paths data in the structured renderer * Add support for maps in the structured renderer * Add support for lists in the structured renderer * goimports * Add support for sets in the structured renderer * goimports * Add support for blocks in the structured renderer * goimports * Add support for outputs in the structured renderer * fix ordering of blocks * remove unused test stub * fix typopull/32477/head
parent
05f1764a0d
commit
9bc5ded27a
@ -0,0 +1,22 @@
|
||||
package change
|
||||
|
||||
import "fmt"
|
||||
|
||||
func TypeChange(before, after Change) Renderer {
|
||||
return &typeChangeRenderer{
|
||||
before: before,
|
||||
after: after,
|
||||
}
|
||||
}
|
||||
|
||||
type typeChangeRenderer struct {
|
||||
NoWarningsRenderer
|
||||
|
||||
before Change
|
||||
after Change
|
||||
}
|
||||
|
||||
func (renderer typeChangeRenderer) Render(change Change, indent int, opts RenderOpts) string {
|
||||
opts.overrideNullSuffix = true // Never render null suffix for children of type changes.
|
||||
return fmt.Sprintf("%s [yellow]->[reset] %s", renderer.before.Render(indent, opts), renderer.after.Render(indent, opts))
|
||||
}
|
||||
@ -1,7 +1,86 @@
|
||||
package differ
|
||||
|
||||
import "github.com/hashicorp/terraform/internal/command/jsonformat/change"
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/command/jsonformat/change"
|
||||
"github.com/hashicorp/terraform/internal/plans"
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
)
|
||||
|
||||
const (
|
||||
jsonNumber = "number"
|
||||
jsonObject = "object"
|
||||
jsonArray = "array"
|
||||
jsonBool = "bool"
|
||||
jsonString = "string"
|
||||
jsonNull = "null"
|
||||
)
|
||||
|
||||
func (v Value) ComputeChangeForOutput() change.Change {
|
||||
panic("not implemented")
|
||||
beforeType := getJsonType(v.Before)
|
||||
afterType := getJsonType(v.After)
|
||||
|
||||
valueToAttribute := func(v Value, jsonType string) change.Change {
|
||||
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:
|
||||
res = v.computeAttributeChangeAsMap(cty.NilType)
|
||||
case jsonArray:
|
||||
res = v.computeAttributeChangeAsList(cty.NilType)
|
||||
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)
|
||||
}
|
||||
|
||||
func getJsonType(json interface{}) string {
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in new issue