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  }