model/layer_params.go (138 lines of code) (raw):

package model import ( "strconv" ) // LayerParams offers Get* function to get value by the key // If not found the key, defaultValue will return type LayerParams interface { AddParam(key string, value interface{}) AddParams(params map[string]interface{}) Get(key string, defaultValue interface{}) interface{} GetString(key, defaultValue string) string GetInt(key string, defaultValue int) int GetFloat(key string, defaultValue float64) float64 GetInt64(key string, defaultValue int64) int64 } type layerParams struct { Parameters map[string]interface{} } func NewLayerParams() *layerParams { return &layerParams{ Parameters: make(map[string]interface{}, 0), } } func (r *layerParams) AddParam(key string, value interface{}) { r.Parameters[key] = value } func (r *layerParams) AddParams(params map[string]interface{}) { for k, v := range params { r.Parameters[k] = v } } func (r *layerParams) Get(key string, defaultValue interface{}) interface{} { if val, ok := r.Parameters[key]; ok { return val } return defaultValue } func (r *layerParams) GetString(key, defaultValue string) string { val, ok := r.Parameters[key] if !ok { return defaultValue } switch value := val.(type) { case string: return value case int: return strconv.Itoa(value) case float64: return strconv.Itoa(int(value)) case int32: return strconv.Itoa(int(value)) case int64: return strconv.Itoa(int(value)) } return defaultValue } func (r *layerParams) GetInt(key string, defaultValue int) int { val, ok := r.Parameters[key] if !ok { return defaultValue } switch value := val.(type) { case int: return value case float64: return int(value) case uint: return int(value) case int32: return int(value) case int64: return int(value) case string: if val, err := strconv.Atoi(value); err == nil { return val } else { return defaultValue } default: return defaultValue } } func (r *layerParams) GetFloat(key string, defaultValue float64) float64 { val, ok := r.Parameters[key] if !ok { return defaultValue } switch value := val.(type) { case float64: return value case int: return float64(value) case string: if f, err := strconv.ParseFloat(value, 64); err == nil { return f } else { return defaultValue } default: return defaultValue } } func (r *layerParams) GetInt64(key string, defaultValue int64) int64 { val, ok := r.Parameters[key] if !ok { return defaultValue } switch value := val.(type) { case int: return int64(value) case float64: return int64(value) case uint: return int64(value) case int32: return int64(value) case int64: return value case string: if val, err := strconv.ParseInt(value, 10, 64); err == nil { return val } else { return defaultValue } default: return defaultValue } } func MergeLayerParams(layersParamsMap map[string]LayerParams) LayerParams { mergedParams := NewLayerParams() for _, unmergedParams := range layersParamsMap { switch v := unmergedParams.(type) { case *layerParams: for k, p := range v.Parameters { mergedParams.Parameters[k] = p } } } return LayerParams(mergedParams) }