code: func (c *TemplateConfig) Merge(o *TemplateConfig) *TemplateConfig {
  	if c == nil {
  		if o == nil {
  			return nil
  		}
  		return o.Copy()
  	}
  
  	if o == nil {
  		return c.Copy()
  	}
  
  	r := c.Copy()
  
  	if o.Backup != nil {
  		r.Backup = o.Backup
  	}
  
  	if o.Command != nil {
  		r.Command = o.Command
  	}
  
  	if o.CommandTimeout != nil {
  		r.CommandTimeout = o.CommandTimeout
  	}
  
  	if o.Contents != nil {
  		r.Contents = o.Contents
  	}
  
  	if o.CreateDestDirs != nil {
  		r.CreateDestDirs = o.CreateDestDirs
  	}
  
  	if o.Destination != nil {
  		r.Destination = o.Destination
  	}
  
  	if o.ErrMissingKey != nil {
  		r.ErrMissingKey = o.ErrMissingKey
  	}
  
  	if o.Exec != nil {
  		r.Exec = r.Exec.Merge(o.Exec)
  	}
  
  	if o.Perms != nil {
  		r.Perms = o.Perms
  	}
  
  	if o.Source != nil {
  		r.Source = o.Source
  	}
  
  	if o.Wait != nil {
  		r.Wait = r.Wait.Merge(o.Wait)
  	}
  
  	if o.LeftDelim != nil {
  		r.LeftDelim = o.LeftDelim
  	}
  
  	if o.RightDelim != nil {
  		r.RightDelim = o.RightDelim
  	}
  
  	return r
  }
docs: // Merge combines all values in this configuration with the values in the other
  // configuration, with values in the other configuration taking precedence.
  // Maps and slices are merged, most other values are overwritten. Complex
  // structs define their own merge functionality.