Custom Elasticsearch Provider - attributes with lists inside maps

Hi all,

I’m currently building a custom Terraform plugin to provision ES clusters. I had originally posted this in the general Terraform section but realized posting here was more appropriate. I want to read in an input that contains a series of maps and lists nested inside an outer list like so:

tf file:

resource "cluster" "my-cluster" {
    api_key = <api_key>
    cluster_name = "my cluster"
    elasticsearch  {
            region = "us-east-1"
            ref_id = "main-elasticsearch"
            plan = {
                cluster_topology {
                    node_type = {
                        data = true
                        master = true
                        ingest = true
                    }

                    instance_configuration_id = "aws.data.highio.i3"
                    zone_count = 2
                    size = {
                        resource = "memory"
                        value = 4096
                    }
           }
   }
}

In this example, the outer elasticsearch attribute is a block of TypeList, the inner plan attribute is of TypeMap, cluster_topology inside of it is of TypeList, and both node_type and size are of TypeMap.

When I run terraform init, I get the following error message:

Error: Missing key/value separator

  on cluster.tf line 8, in resource "cluster" "my-cluster":
   7:
   8:                 cluster_topology {

Expected an equals sign ("=") to mark the beginning of the attribute value.

Given that I can use tf syntax to describe a TypeList object as a block and a TypeMap object with an = to indicate that it’s an attribute, I’m curious to know why I’m seeing this error. Would love some input on how to fix it as well.

When I include the = as part of cluster_topology's declaration, I see the following error message:

Inappropriate value for attribute "plan": element "cluster_topology": string
required.

Here’s a snippet of the schema definitions in my resource file:

"elasticsearch": &schema.Schema{
                                Type:    schema.TypeList,
                                Elem: &schema.Resource{
                                    Schema: map[string]*schema.Schema{
                                        "region": &schema.Schema{
                                            Type: schema.TypeString,
                                            Required: true,
                                        },
                                        "ref_id": &schema.Schema{
                                            Type: schema.TypeString,
                                            Required: true,
                                        },
                                        "plan": &schema.Schema{
                                            Type: schema.TypeMap,
                                            Elem: &schema.Resource{
                                                Schema: map[string]*schema.Schema{
                                                    "cluster_topology": &schema.Schema{
                                                        Type: schema.TypeList,
                                                        Elem: &schema.Resource{
                                                            Schema: map[string]*schema.Schema{
                                                                "node_type": &schema.Schema{
                                                                    Type: schema.TypeMap,
                                                                    Elem: &schema.Resource{
                                                                        Schema: map[string]*schema.Schema{
                                                                            "data": &schema.Schema{
                                                                                Type: schema.TypeBool,
                                                                                Required: true,
                                                                            },
                                                                            "master": &schema.Schema{
                                                                                Type: schema.TypeBool,
                                                                                Required: true,
                                                                            },
                                                                            "ingest": &schema.Schema{
                                                                                Type: schema.TypeBool,
                                                                                Required: true,
                                                                            },
                                                                        },
                                                                    },
                                                                    Required: true,
                                                                },