github.com/mundipagg/tracer-splunk-writer@v1.0.6/entry.go (about)

     1  package splunk
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  )
     7  
     8  type Entry map[string]interface{}
     9  
    10  func (log Entry) Add(name string, value interface{}) Entry {
    11  	log[name] = value
    12  	return log
    13  }
    14  
    15  func NewEntry(p ...interface{}) Entry {
    16  	if len(p) == 1 {
    17  		c, ok := p[0].([]interface{})
    18  		if ok {
    19  			p = c
    20  		}
    21  	}
    22  	normalized := Entry{}
    23  	for _, item := range p {
    24  		if item == nil {
    25  			continue
    26  		}
    27  		itemType := reflect.TypeOf(item)
    28  		v := reflect.ValueOf(item)
    29  		inner := Entry{}
    30  		switch itemType.Kind() {
    31  		case reflect.Map:
    32  			for _, key := range v.MapKeys() {
    33  				inner[fmt.Sprint(key.Interface())] = v.MapIndex(key).Interface()
    34  			}
    35  		case reflect.Ptr, reflect.Interface:
    36  			if !v.IsNil() {
    37  				inner = NewEntry(v.Elem().Interface())
    38  			}
    39  		default:
    40  			inner[itemType.Name()] = item
    41  		}
    42  		normalized = Merge(normalized, inner)
    43  	}
    44  	return normalized
    45  }
    46  
    47  func Merge(np Entry, other Entry) Entry {
    48  	collisions := map[string]int{}
    49  	r := Entry{}
    50  	for key, value := range np {
    51  		r[key] = value
    52  	}
    53  	for key, value := range other {
    54  		if _, ok := r[key]; ok {
    55  			var index int
    56  			if index, ok = collisions[key]; !ok {
    57  				index = 0
    58  			}
    59  			index += 1
    60  			collisions[key] = index
    61  			key = fmt.Sprintf("%s%d", key, index)
    62  		}
    63  		r[key] = value
    64  	}
    65  	return r
    66  }