Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to modify a cty.ObjectVal? #57

Closed
steeve85 opened this issue Jun 7, 2020 · 2 comments
Closed

How to modify a cty.ObjectVal? #57

steeve85 opened this issue Jun 7, 2020 · 2 comments

Comments

@steeve85
Copy link

steeve85 commented Jun 7, 2020

I am new to Go and to go-cty, and I am wondering how to add a new element into a["type"] based on the following sample:

a := map[string]cty.Value{
	"type": cty.ObjectVal(map[string]cty.Value{
		"name": cty.ObjectVal(map[string]cty.Value{
			"id": cty.StringVal("value"),
		}),
	}),
}

I tried something like a["type"]["test"] = cty.StringVal("value") and a["type"].AsValueMap()["test"] = cty.StringVal("test2") but it didn't work.

How can I add a new element into a["type"]? Thanks

@apparentlymart
Copy link
Collaborator

Hi @steeve85,

cty values are, by design, always immutable. Instead of modifying an existing object, you must construct a new object.

If the change you want to make is shallow (that is, it only involves changes to the top-level map or object) then AsValueMap can be part of the solution, but you then need to pass the modified map back to cty.MapVal or cty.ObjectVal (depending on whether you intend to create a map-typed or object-typed value) to construct the new value:

foo1 := cty.ObjectVal(map[string]cty.Value{
  "example1": cty.StringVal("a"),
})
fooMap := foo1.AsValueMap()
fooMap["example2"] = cty.StringVal("b")
foo2 := cty.ObjectVal(fooMap)

If you want to make a change deep inside the structure then things can get more involved: you'll need to reconstruct each level you want to modify one at a time.

cty is designed to be used as part of implementing languages that use a functional programming style with no mutation, so there are no functions for modifying values in-place. In practice applications that use values resulting from such a language, such as Terraform providers consuming the result of evaluating a Terraform configuration, do it by converting from cty.Value to some suitable application-specific data type -- which, in the case of Terraform providers, is mutable -- and then convert that data type back into an entirely new cty.Value to return, so the cty representation is used only for transport to and from the language runtime and not for internal processing.

@steeve85
Copy link
Author

@apparentlymart Great, totally make sense. Thank you for the help!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants