github.com/chanzuckerberg/terraform@v0.11.12-beta1/config/append.go (about)

     1  package config
     2  
     3  // Append appends one configuration to another.
     4  //
     5  // Append assumes that both configurations will not have
     6  // conflicting variables, resources, etc. If they do, the
     7  // problems will be caught in the validation phase.
     8  //
     9  // It is possible that c1, c2 on their own are not valid. For
    10  // example, a resource in c2 may reference a variable in c1. But
    11  // together, they would be valid.
    12  func Append(c1, c2 *Config) (*Config, error) {
    13  	c := new(Config)
    14  
    15  	// Append unknown keys, but keep them unique since it is a set
    16  	unknowns := make(map[string]struct{})
    17  	for _, k := range c1.unknownKeys {
    18  		_, present := unknowns[k]
    19  		if !present {
    20  			unknowns[k] = struct{}{}
    21  			c.unknownKeys = append(c.unknownKeys, k)
    22  		}
    23  	}
    24  
    25  	for _, k := range c2.unknownKeys {
    26  		_, present := unknowns[k]
    27  		if !present {
    28  			unknowns[k] = struct{}{}
    29  			c.unknownKeys = append(c.unknownKeys, k)
    30  		}
    31  	}
    32  
    33  	c.Atlas = c1.Atlas
    34  	if c2.Atlas != nil {
    35  		c.Atlas = c2.Atlas
    36  	}
    37  
    38  	// merge Terraform blocks
    39  	if c1.Terraform != nil {
    40  		c.Terraform = c1.Terraform
    41  		if c2.Terraform != nil {
    42  			c.Terraform.Merge(c2.Terraform)
    43  		}
    44  	} else {
    45  		c.Terraform = c2.Terraform
    46  	}
    47  
    48  	if len(c1.Modules) > 0 || len(c2.Modules) > 0 {
    49  		c.Modules = make(
    50  			[]*Module, 0, len(c1.Modules)+len(c2.Modules))
    51  		c.Modules = append(c.Modules, c1.Modules...)
    52  		c.Modules = append(c.Modules, c2.Modules...)
    53  	}
    54  
    55  	if len(c1.Outputs) > 0 || len(c2.Outputs) > 0 {
    56  		c.Outputs = make(
    57  			[]*Output, 0, len(c1.Outputs)+len(c2.Outputs))
    58  		c.Outputs = append(c.Outputs, c1.Outputs...)
    59  		c.Outputs = append(c.Outputs, c2.Outputs...)
    60  	}
    61  
    62  	if len(c1.ProviderConfigs) > 0 || len(c2.ProviderConfigs) > 0 {
    63  		c.ProviderConfigs = make(
    64  			[]*ProviderConfig,
    65  			0, len(c1.ProviderConfigs)+len(c2.ProviderConfigs))
    66  		c.ProviderConfigs = append(c.ProviderConfigs, c1.ProviderConfigs...)
    67  		c.ProviderConfigs = append(c.ProviderConfigs, c2.ProviderConfigs...)
    68  	}
    69  
    70  	if len(c1.Resources) > 0 || len(c2.Resources) > 0 {
    71  		c.Resources = make(
    72  			[]*Resource,
    73  			0, len(c1.Resources)+len(c2.Resources))
    74  		c.Resources = append(c.Resources, c1.Resources...)
    75  		c.Resources = append(c.Resources, c2.Resources...)
    76  	}
    77  
    78  	if len(c1.Variables) > 0 || len(c2.Variables) > 0 {
    79  		c.Variables = make(
    80  			[]*Variable, 0, len(c1.Variables)+len(c2.Variables))
    81  		c.Variables = append(c.Variables, c1.Variables...)
    82  		c.Variables = append(c.Variables, c2.Variables...)
    83  	}
    84  
    85  	if len(c1.Locals) > 0 || len(c2.Locals) > 0 {
    86  		c.Locals = make([]*Local, 0, len(c1.Locals)+len(c2.Locals))
    87  		c.Locals = append(c.Locals, c1.Locals...)
    88  		c.Locals = append(c.Locals, c2.Locals...)
    89  	}
    90  
    91  	return c, nil
    92  }