github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/utils/mapobject.go (about) 1 /* 2 * Copyright (c) 2020-present unTill Pro, Ltd. 3 */ 4 5 package coreutils 6 7 import "fmt" 8 9 type MapObject map[string]interface{} 10 11 func (m MapObject) AsString(name string) (val string, ok bool, err error) { 12 switch v := m[name].(type) { 13 case nil: 14 return "", false, nil 15 case string: 16 return v, true, nil 17 default: 18 return "", true, fmt.Errorf("field '%s' must be a string: %w", name, ErrFieldTypeMismatch) 19 } 20 } 21 22 func (m MapObject) AsStringRequired(name string) (val string, err error) { 23 val, ok, err := m.AsString(name) 24 if err != nil { 25 return "", err 26 } 27 if !ok { 28 return "", fmt.Errorf("field '%s' missing: %w", name, ErrFieldsMissed) 29 } 30 return val, nil 31 } 32 33 func (m MapObject) AsObject(name string) (val MapObject, ok bool, err error) { 34 switch v := m[name].(type) { 35 case nil: 36 return nil, false, nil 37 case map[string]interface{}: 38 return MapObject(v), true, nil 39 default: 40 return nil, true, fmt.Errorf("field '%s' must be an object: %w", name, ErrFieldTypeMismatch) 41 } 42 } 43 44 func (m MapObject) AsInt64(name string) (val int64, ok bool, err error) { 45 switch v := m[name].(type) { 46 case nil: 47 return 0, false, nil 48 case float64: 49 return int64(v), true, nil 50 case int64: 51 return v, true, nil 52 default: 53 return 0, true, fmt.Errorf("field '%s' must be an int64: %w", name, ErrFieldTypeMismatch) 54 } 55 } 56 57 func (m MapObject) AsObjects(name string) (val []interface{}, ok bool, err error) { 58 switch v := m[name].(type) { 59 case nil: 60 return nil, false, nil 61 case []interface{}: 62 return v, true, nil 63 default: 64 return nil, true, fmt.Errorf("field '%s' must be an array of objects: %w", name, ErrFieldTypeMismatch) 65 } 66 } 67 68 func (m MapObject) AsFloat64(name string) (val float64, ok bool, err error) { 69 switch v := m[name].(type) { 70 case nil: 71 return 0, false, nil 72 case float64: 73 return v, true, nil 74 default: 75 return 0, true, fmt.Errorf("field '%s' must be a float64: %w", name, ErrFieldTypeMismatch) 76 } 77 } 78 79 func (m MapObject) AsBoolean(name string) (val bool, ok bool, err error) { 80 switch v := m[name].(type) { 81 case nil: 82 return false, false, nil 83 case bool: 84 return v, true, nil 85 default: 86 return false, true, fmt.Errorf("field '%s' must be a boolean: %w", name, ErrFieldTypeMismatch) 87 } 88 }