1 // Copyright 2012-2017 Charles Banning. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file 4 5 package mxj 6 7 import ( 8 "encoding/json" 9 "errors" 10 "reflect" 11 12 // "github.com/fatih/structs" 13 ) 14 15 // Create a new Map value from a structure. Error returned if argument is not a structure. 16 // Only public structure fields are decoded in the Map value. See github.com/fatih/structs#Map 17 // for handling of "structs" tags. 18 19 // DEPRECATED - import github.com/fatih/structs and cast result of structs.Map to mxj.Map. 20 // import "github.com/fatih/structs" 21 // ... 22 // sm, err := structs.Map(<some struct>) 23 // if err != nil { 24 // // handle error 25 // } 26 // m := mxj.Map(sm) 27 // Alernatively uncomment the old source and import in struct.go. 28 func NewMapStruct(structVal interface{}) (Map, error) { 29 return nil, errors.New("deprecated - see package documentation") 30 /* 31 if !structs.IsStruct(structVal) { 32 return nil, errors.New("NewMapStruct() error: argument is not type Struct") 33 } 34 return structs.Map(structVal), nil 35 */ 36 } 37 38 // Marshal a map[string]interface{} into a structure referenced by 'structPtr'. Error returned 39 // if argument is not a pointer or if json.Unmarshal returns an error. 40 // json.Unmarshal structure encoding rules are followed to encode public structure fields. 41 func (mv Map) Struct(structPtr interface{}) error { 42 // should check that we're getting a pointer. 43 if reflect.ValueOf(structPtr).Kind() != reflect.Ptr { 44 return errors.New("mv.Struct() error: argument is not type Ptr") 45 } 46 47 m := map[string]interface{}(mv) 48 j, err := json.Marshal(m) 49 if err != nil { 50 return err 51 } 52 53 return json.Unmarshal(j, structPtr) 54 } 55