github.com/free5gc/openapi@v1.0.8/convert.go (about)

     1  package openapi
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"time"
     7  
     8  	"github.com/mitchellh/mapstructure"
     9  )
    10  
    11  func openAPIDecodeHook(from reflect.Type, to reflect.Type, v interface{}) (interface{}, error) {
    12  	// convert OpenAPI DateTime to time.Time based on RFC3339
    13  	if to == reflect.TypeOf(time.Time{}) && from == reflect.TypeOf("") {
    14  		return time.Parse(time.RFC3339, v.(string))
    15  	}
    16  	return v, nil
    17  }
    18  
    19  // Convert - convert map[string]interface{} to openapi models
    20  func Convert(from interface{}, to interface{}) error {
    21  	config := mapstructure.DecoderConfig{
    22  		DecodeHook: openAPIDecodeHook,
    23  		Result:     to,
    24  	}
    25  
    26  	decoder, err := mapstructure.NewDecoder(&config)
    27  	if err != nil {
    28  		return fmt.Errorf("openapi: converter setup failed: %v", err)
    29  	}
    30  
    31  	err = decoder.Decode(from)
    32  	if err != nil {
    33  		return fmt.Errorf("openapi: convert to %v failed: %v", reflect.TypeOf(to), err)
    34  	}
    35  
    36  	return nil
    37  }