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  }