github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/alter/sum.go (about) 1 package alter 2 3 import ( 4 "fmt" 5 6 "github.com/lmorg/murex/debug" 7 "github.com/lmorg/murex/lang/types" 8 "github.com/lmorg/murex/utils/lists" 9 ) 10 11 func sumMap(v interface{}, new *interface{}) (ret interface{}, err error) { 12 if !debug.Enabled { 13 defer func() { 14 if r := recover(); r != nil { 15 err = fmt.Errorf("cannot merge new map into old. Likely this is because of a data-type mismatch: %s", r) 16 } 17 }() 18 } 19 20 switch ret := v.(type) { 21 case map[string]int: 22 newV := make(map[string]int) 23 for k, v := range (*new).(map[string]int) { 24 f, err := types.ConvertGoType(v, types.Integer) 25 if err != nil { 26 return ret, err 27 } 28 newV[k] = f.(int) 29 } 30 31 lists.SumInt(ret, newV) 32 33 case map[string]float64: 34 newV := make(map[string]float64) 35 for k, v := range (*new).(map[string]float64) { 36 f, err := types.ConvertGoType(v, types.Float) 37 if err != nil { 38 return ret, err 39 } 40 newV[k] = f.(float64) 41 } 42 43 lists.SumFloat64(ret, newV) 44 45 case map[string]interface{}: 46 err := lists.SumInterface(ret, (*new).(map[string]interface{})) 47 return ret, err 48 49 default: 50 return v, fmt.Errorf("path either points to an object that's not an map or no condition has been made for %T", v) 51 } 52 53 return 54 }