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 }