Kit Sunde
Kit Sunde

Reputation: 37075

Is it possible to perform nested iterations in HCL resulting in a flat list without calling flatten?

Is it possible with HCL to have nested iterations returning a flat list(map) without resorting to flatten?

I have this:

locals {
  mappings = flatten([
    for record_type in var.record_types : [
      for host in var.hosts : {
        type = record_type,
        host = host
      }
    ]
  ])
}

I would like to remove the need for flatten like this:

locals {
  mappings = [
    for record_type in var.record_types :
      for host in var.hosts : {
        type = record_type,
        host = host
      }
    ]
}

But it seems like each for .. in must return data.

Upvotes: 0

Views: 263

Answers (1)

mariux
mariux

Reputation: 3127

One alternative I could think of to only have a single for-loop is using setproduct():

variable "record_types" {
  default = ["type1", "type2"]
}

variable "hosts" {
  default = ["host1", "host2"]
}

locals {
  mappings = [
    for i in setproduct(var.record_types, var.hosts) : {
      type = i[0],
      host = i[1],
    }
  ]
}

output "mappings" {
  value = local.mappings
}

after terraform apply resulting in:

Outputs:

mappings = [
  {
    "host" = "host1"
    "type" = "type1"
  },
  {
    "host" = "host2"
    "type" = "type1"
  },
  {
    "host" = "host1"
    "type" = "type2"
  },
  {
    "host" = "host2"
    "type" = "type2"
  },
]

Of course, the two variables need to be independent sets here.

If you want to support duplicates or have dependent inputs, flatten() with two loops is the way.

Upvotes: 1

Related Questions