| package mapstructure | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | ) | 
 |  | 
 | func ExampleDecode() { | 
 | 	type Person struct { | 
 | 		Name   string | 
 | 		Age    int | 
 | 		Emails []string | 
 | 		Extra  map[string]string | 
 | 	} | 
 |  | 
 | 	// This input can come from anywhere, but typically comes from | 
 | 	// something like decoding JSON where we're not quite sure of the | 
 | 	// struct initially. | 
 | 	input := map[string]interface{}{ | 
 | 		"name":   "Mitchell", | 
 | 		"age":    91, | 
 | 		"emails": []string{"one", "two", "three"}, | 
 | 		"extra": map[string]string{ | 
 | 			"twitter": "mitchellh", | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	var result Person | 
 | 	err := Decode(input, &result) | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	fmt.Printf("%#v", result) | 
 | 	// Output: | 
 | 	// mapstructure.Person{Name:"Mitchell", Age:91, Emails:[]string{"one", "two", "three"}, Extra:map[string]string{"twitter":"mitchellh"}} | 
 | } | 
 |  | 
 | func ExampleDecode_errors() { | 
 | 	type Person struct { | 
 | 		Name   string | 
 | 		Age    int | 
 | 		Emails []string | 
 | 		Extra  map[string]string | 
 | 	} | 
 |  | 
 | 	// This input can come from anywhere, but typically comes from | 
 | 	// something like decoding JSON where we're not quite sure of the | 
 | 	// struct initially. | 
 | 	input := map[string]interface{}{ | 
 | 		"name":   123, | 
 | 		"age":    "bad value", | 
 | 		"emails": []int{1, 2, 3}, | 
 | 	} | 
 |  | 
 | 	var result Person | 
 | 	err := Decode(input, &result) | 
 | 	if err == nil { | 
 | 		panic("should have an error") | 
 | 	} | 
 |  | 
 | 	fmt.Println(err.Error()) | 
 | 	// Output: | 
 | 	// 5 error(s) decoding: | 
 | 	// | 
 | 	// * 'Age' expected type 'int', got unconvertible type 'string' | 
 | 	// * 'Emails[0]' expected type 'string', got unconvertible type 'int' | 
 | 	// * 'Emails[1]' expected type 'string', got unconvertible type 'int' | 
 | 	// * 'Emails[2]' expected type 'string', got unconvertible type 'int' | 
 | 	// * 'Name' expected type 'string', got unconvertible type 'int' | 
 | } | 
 |  | 
 | func ExampleDecode_metadata() { | 
 | 	type Person struct { | 
 | 		Name string | 
 | 		Age  int | 
 | 	} | 
 |  | 
 | 	// This input can come from anywhere, but typically comes from | 
 | 	// something like decoding JSON where we're not quite sure of the | 
 | 	// struct initially. | 
 | 	input := map[string]interface{}{ | 
 | 		"name":  "Mitchell", | 
 | 		"age":   91, | 
 | 		"email": "foo@bar.com", | 
 | 	} | 
 |  | 
 | 	// For metadata, we make a more advanced DecoderConfig so we can | 
 | 	// more finely configure the decoder that is used. In this case, we | 
 | 	// just tell the decoder we want to track metadata. | 
 | 	var md Metadata | 
 | 	var result Person | 
 | 	config := &DecoderConfig{ | 
 | 		Metadata: &md, | 
 | 		Result:   &result, | 
 | 	} | 
 |  | 
 | 	decoder, err := NewDecoder(config) | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	if err := decoder.Decode(input); err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	fmt.Printf("Unused keys: %#v", md.Unused) | 
 | 	// Output: | 
 | 	// Unused keys: []string{"email"} | 
 | } | 
 |  | 
 | func ExampleDecode_weaklyTypedInput() { | 
 | 	type Person struct { | 
 | 		Name   string | 
 | 		Age    int | 
 | 		Emails []string | 
 | 	} | 
 |  | 
 | 	// This input can come from anywhere, but typically comes from | 
 | 	// something like decoding JSON, generated by a weakly typed language | 
 | 	// such as PHP. | 
 | 	input := map[string]interface{}{ | 
 | 		"name":   123,                      // number => string | 
 | 		"age":    "42",                     // string => number | 
 | 		"emails": map[string]interface{}{}, // empty map => empty array | 
 | 	} | 
 |  | 
 | 	var result Person | 
 | 	config := &DecoderConfig{ | 
 | 		WeaklyTypedInput: true, | 
 | 		Result:           &result, | 
 | 	} | 
 |  | 
 | 	decoder, err := NewDecoder(config) | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	err = decoder.Decode(input) | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	fmt.Printf("%#v", result) | 
 | 	// Output: mapstructure.Person{Name:"123", Age:42, Emails:[]string{}} | 
 | } | 
 |  | 
 | func ExampleDecode_tags() { | 
 | 	// Note that the mapstructure tags defined in the struct type | 
 | 	// can indicate which fields the values are mapped to. | 
 | 	type Person struct { | 
 | 		Name string `mapstructure:"person_name"` | 
 | 		Age  int    `mapstructure:"person_age"` | 
 | 	} | 
 |  | 
 | 	input := map[string]interface{}{ | 
 | 		"person_name": "Mitchell", | 
 | 		"person_age":  91, | 
 | 	} | 
 |  | 
 | 	var result Person | 
 | 	err := Decode(input, &result) | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	fmt.Printf("%#v", result) | 
 | 	// Output: | 
 | 	// mapstructure.Person{Name:"Mitchell", Age:91} | 
 | } | 
 |  | 
 | func ExampleDecode_embeddedStruct() { | 
 | 	// Squashing multiple embedded structs is allowed using the squash tag. | 
 | 	// This is demonstrated by creating a composite struct of multiple types | 
 | 	// and decoding into it. In this case, a person can carry with it both | 
 | 	// a Family and a Location, as well as their own FirstName. | 
 | 	type Family struct { | 
 | 		LastName string | 
 | 	} | 
 | 	type Location struct { | 
 | 		City string | 
 | 	} | 
 | 	type Person struct { | 
 | 		Family    `mapstructure:",squash"` | 
 | 		Location  `mapstructure:",squash"` | 
 | 		FirstName string | 
 | 	} | 
 |  | 
 | 	input := map[string]interface{}{ | 
 | 		"FirstName": "Mitchell", | 
 | 		"LastName":  "Hashimoto", | 
 | 		"City":      "San Francisco", | 
 | 	} | 
 |  | 
 | 	var result Person | 
 | 	err := Decode(input, &result) | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	fmt.Printf("%s %s, %s", result.FirstName, result.LastName, result.City) | 
 | 	// Output: | 
 | 	// Mitchell Hashimoto, San Francisco | 
 | } |