You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: search_aggs_metrics_weighted_avg.go
    path of file: ./repos/scan4all/vendor/github.com/olivere/elastic
    
    the code of the file until where you have to start completion: // Copyright 2012-present Oliver Eilhard. All rights reserved.
// Use of this source code is governed by a MIT-license.
// See http://olivere.mit-license.org/license.txt for details.

package elastic

// WeightedAvgAggregation is a single-value metrics aggregation that
// computes the weighted average of numeric values that are extracted
// from the aggregated documents. These values can be extracted either
// from specific numeric fields in the documents.
//
// See: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations-metrics-weight-avg-aggregation.html
type WeightedAvgAggregation struct {
	fields          map[string]*MultiValuesSourceFieldConfig
	valueType       string
	format          string
	value           *MultiValuesSourceFieldConfig
	weight          *MultiValuesSourceFieldConfig
	subAggregations map[string]Aggregation
	meta            map[string]interface{}
}

func NewWeightedAvgAggregation() *WeightedAvgAggregation {
	return &WeightedAvgAggregation{
		fields:
    
func (a *WeightedAvgAggregation) Source() (interface{}, error) {
	source := make(map[string]interface{})
	opts := make(map[string]interface{})
	source["weighted_avg"] = opts

	if len(a.fields) > 0 {
		f := make(map[string]interface{})
		for name, config := range a.fields {
			cfg, err := config.Source()
			if err != nil {
				return nil, err
			}
			f[name] = cfg
		}
		opts["fields"] = f
	}

	if v := a.format; v != "" {
		opts["format"] = v
	}

	if v := a.valueType; v != "" {
		opts["value_type"] = v
	}

	if v := a.value; v != nil {
		cfg, err := v.Source()
		if err != nil {
			return nil, err
		}
		opts["value"] = cfg
	}

	if v := a.weight; v != nil {
		cfg, err := v.Source()
		if err != nil {
			return nil, err
		}
		opts["weight"] = cfg
	}

	// AggregationBuilder (SubAggregations)
	if len(a.subAggregations) > 0 {
		aggsMap := make(map[string]interface{})
		source["aggregations"] = aggsMap
		for name, aggregate := range a.subAggregations {
			src, err := aggregate.Source()
			if err != nil {
				return nil, err
			}
			aggsMap[name] = src
		}
	}

	// Add Meta data if available
	if len(a.meta) > 0 {
		source["meta"] = a.meta
	}

	return source, nil
}