github.com/vmware/transport-go@v1.3.4/model/util.go (about)

     1  // Copyright 2019-2020 VMware, Inc.
     2  // SPDX-License-Identifier: BSD-2-Clause
     3  
     4  package model
     5  
     6  import (
     7  	"encoding/json"
     8  	"reflect"
     9  )
    10  
    11  func ConvertValueToType(value interface{}, targetType reflect.Type) (interface{}, error) {
    12  	if targetType == nil {
    13  		return value, nil
    14  	}
    15  
    16  	itemType := targetType
    17  	var isTargetTypePointer bool
    18  
    19  	if itemType.Kind() == reflect.Ptr {
    20  		isTargetTypePointer = true
    21  		itemType = itemType.Elem()
    22  	}
    23  
    24  	decodedValuePtr := reflect.New(itemType).Interface()
    25  
    26  	marshaledValue, _ := json.Marshal(value)
    27  	decodeErr := json.Unmarshal(marshaledValue, decodedValuePtr)
    28  
    29  	if decodeErr != nil {
    30  		return nil, decodeErr
    31  	}
    32  
    33  	if isTargetTypePointer {
    34  		return decodedValuePtr, nil
    35  	} else {
    36  		return reflect.ValueOf(decodedValuePtr).Elem().Interface(), nil
    37  	}
    38  }