Skip to content

This module performs a deep map merge of standard Terraform maps/objects

License

Notifications You must be signed in to change notification settings

Invicton-Labs/terraform-null-deepmerge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Deepmerge

This module performs a deep map merge of standard Terraform maps/objects. It is functionally similar to the built-in merge function, except that it will merge maps at the same depth instead of overwriting them. It can handle maps with a depth up to 100 (see commented-out code at the bottom of main.tf if you want to modify it to handle deeper maps).

It functions by "flattening" each input map into a map of depth 1 where each key is the full path to the value in question. It then uses the standard merge function on these flat maps, and finally it re-builds the map structure in reverse order.

Note: Lists will be overwritten. Only maps are merged.

Usage

locals {
  map1 = {
    key1-1 = {
      key1-1-1 = "value1-1-1"
      key1-1-2 = "value1-1-2"
      key1-1-3 = {
        key1-1-3-1 = "value1-1-3-1"
        key1-1-3-2 = "value1-1-3-2"
      }
    }
    key1-2 = "value1-2"
    key1-3 = {
      key1-3-1 = "value1-3-1"
      key1-3-2 = "value1-3-2"
    }
  }

  map2 = {
    key1-1 = {
      key1-1-1 = "value1-1-1(overwrite)"
      key1-1-3 = {
        key1-1-3-2 = "value1-1-3-2(overwrite)"
        key1-1-3-3 = {
          key1-1-3-3-1 = "value1-1-3-3-1"
        }
      }
      key1-1-4 = "value1-1-4"
    }
    key1-2 = {
      key1-2-1 = "value1-2-1"
      key1-2-2 = "value1-2-2"
      key1-2-3 = {
        key1-2-3-1 = "value1-2-3-1"
      }
    }
    key1-3 = "value1-3(overwrite)"
  }

  map3 = {
    key1-3 = "value1-3(double-overwrite)"
    key1-2 = {
      key1-2-3 = {
        key1-2-3-2 = "value1-2-3-2"
      }
    }
  }
}

module "deepmerge" {
  source  = "Invicton-Labs/deepmerge/null"
  maps = [
    local.map1,
    local.map2,
    local.map3
  ]
}

output "merged" {
  description = "The merged map."
  value       = module.deepmerge.merged
}

Output:

merged = {
  "key1-1" = {
    "key1-1-1" = "value1-1-1(overwrite)"
    "key1-1-2" = "value1-1-2"
    "key1-1-3" = {
      "key1-1-3-1" = "value1-1-3-1"
      "key1-1-3-2" = "value1-1-3-2(overwrite)"
      "key1-1-3-3" = {
        "key1-1-3-3-1" = "value1-1-3-3-1"
      }
    }
    "key1-1-4" = "value1-1-4"
  }
  "key1-2" = {
    "key1-2-1" = "value1-2-1"
    "key1-2-2" = "value1-2-2"
    "key1-2-3" = {
      "key1-2-3-1" = "value1-2-3-1"
      "key1-2-3-2" = "value1-2-3-2"
    }
  }
  "key1-3" = "value1-3(double-overwrite)"
}

About

This module performs a deep map merge of standard Terraform maps/objects

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages