cloudflare/cfssl_trust
Publicmirrored from https://github.com/cloudflare/cfssl_trustAvailable
vendor/github.com/mitchellh/mapstructure/mapstructure_examples_test.go
203lines · modecode
| 1 | package mapstructure |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | ) |
| 6 | |
| 7 | func ExampleDecode() { |
| 8 | type Person struct { |
| 9 | Name string |
| 10 | Age int |
| 11 | Emails []string |
| 12 | Extra map[string]string |
| 13 | } |
| 14 | |
| 15 | // This input can come from anywhere, but typically comes from |
| 16 | // something like decoding JSON where we're not quite sure of the |
| 17 | // struct initially. |
| 18 | input := map[string]interface{}{ |
| 19 | "name": "Mitchell", |
| 20 | "age": 91, |
| 21 | "emails": []string{"one", "two", "three"}, |
| 22 | "extra": map[string]string{ |
| 23 | "twitter": "mitchellh", |
| 24 | }, |
| 25 | } |
| 26 | |
| 27 | var result Person |
| 28 | err := Decode(input, &result) |
| 29 | if err != nil { |
| 30 | panic(err) |
| 31 | } |
| 32 | |
| 33 | fmt.Printf("%#v", result) |
| 34 | // Output: |
| 35 | // mapstructure.Person{Name:"Mitchell", Age:91, Emails:[]string{"one", "two", "three"}, Extra:map[string]string{"twitter":"mitchellh"}} |
| 36 | } |
| 37 | |
| 38 | func ExampleDecode_errors() { |
| 39 | type Person struct { |
| 40 | Name string |
| 41 | Age int |
| 42 | Emails []string |
| 43 | Extra map[string]string |
| 44 | } |
| 45 | |
| 46 | // This input can come from anywhere, but typically comes from |
| 47 | // something like decoding JSON where we're not quite sure of the |
| 48 | // struct initially. |
| 49 | input := map[string]interface{}{ |
| 50 | "name": 123, |
| 51 | "age": "bad value", |
| 52 | "emails": []int{1, 2, 3}, |
| 53 | } |
| 54 | |
| 55 | var result Person |
| 56 | err := Decode(input, &result) |
| 57 | if err == nil { |
| 58 | panic("should have an error") |
| 59 | } |
| 60 | |
| 61 | fmt.Println(err.Error()) |
| 62 | // Output: |
| 63 | // 5 error(s) decoding: |
| 64 | // |
| 65 | // * 'Age' expected type 'int', got unconvertible type 'string' |
| 66 | // * 'Emails[0]' expected type 'string', got unconvertible type 'int' |
| 67 | // * 'Emails[1]' expected type 'string', got unconvertible type 'int' |
| 68 | // * 'Emails[2]' expected type 'string', got unconvertible type 'int' |
| 69 | // * 'Name' expected type 'string', got unconvertible type 'int' |
| 70 | } |
| 71 | |
| 72 | func ExampleDecode_metadata() { |
| 73 | type Person struct { |
| 74 | Name string |
| 75 | Age int |
| 76 | } |
| 77 | |
| 78 | // This input can come from anywhere, but typically comes from |
| 79 | // something like decoding JSON where we're not quite sure of the |
| 80 | // struct initially. |
| 81 | input := map[string]interface{}{ |
| 82 | "name": "Mitchell", |
| 83 | "age": 91, |
| 84 | "email": "foo@bar.com", |
| 85 | } |
| 86 | |
| 87 | // For metadata, we make a more advanced DecoderConfig so we can |
| 88 | // more finely configure the decoder that is used. In this case, we |
| 89 | // just tell the decoder we want to track metadata. |
| 90 | var md Metadata |
| 91 | var result Person |
| 92 | config := &DecoderConfig{ |
| 93 | Metadata: &md, |
| 94 | Result: &result, |
| 95 | } |
| 96 | |
| 97 | decoder, err := NewDecoder(config) |
| 98 | if err != nil { |
| 99 | panic(err) |
| 100 | } |
| 101 | |
| 102 | if err := decoder.Decode(input); err != nil { |
| 103 | panic(err) |
| 104 | } |
| 105 | |
| 106 | fmt.Printf("Unused keys: %#v", md.Unused) |
| 107 | // Output: |
| 108 | // Unused keys: []string{"email"} |
| 109 | } |
| 110 | |
| 111 | func ExampleDecode_weaklyTypedInput() { |
| 112 | type Person struct { |
| 113 | Name string |
| 114 | Age int |
| 115 | Emails []string |
| 116 | } |
| 117 | |
| 118 | // This input can come from anywhere, but typically comes from |
| 119 | // something like decoding JSON, generated by a weakly typed language |
| 120 | // such as PHP. |
| 121 | input := map[string]interface{}{ |
| 122 | "name": 123, // number => string |
| 123 | "age": "42", // string => number |
| 124 | "emails": map[string]interface{}{}, // empty map => empty array |
| 125 | } |
| 126 | |
| 127 | var result Person |
| 128 | config := &DecoderConfig{ |
| 129 | WeaklyTypedInput: true, |
| 130 | Result: &result, |
| 131 | } |
| 132 | |
| 133 | decoder, err := NewDecoder(config) |
| 134 | if err != nil { |
| 135 | panic(err) |
| 136 | } |
| 137 | |
| 138 | err = decoder.Decode(input) |
| 139 | if err != nil { |
| 140 | panic(err) |
| 141 | } |
| 142 | |
| 143 | fmt.Printf("%#v", result) |
| 144 | // Output: mapstructure.Person{Name:"123", Age:42, Emails:[]string{}} |
| 145 | } |
| 146 | |
| 147 | func ExampleDecode_tags() { |
| 148 | // Note that the mapstructure tags defined in the struct type |
| 149 | // can indicate which fields the values are mapped to. |
| 150 | type Person struct { |
| 151 | Name string `mapstructure:"person_name"` |
| 152 | Age int `mapstructure:"person_age"` |
| 153 | } |
| 154 | |
| 155 | input := map[string]interface{}{ |
| 156 | "person_name": "Mitchell", |
| 157 | "person_age": 91, |
| 158 | } |
| 159 | |
| 160 | var result Person |
| 161 | err := Decode(input, &result) |
| 162 | if err != nil { |
| 163 | panic(err) |
| 164 | } |
| 165 | |
| 166 | fmt.Printf("%#v", result) |
| 167 | // Output: |
| 168 | // mapstructure.Person{Name:"Mitchell", Age:91} |
| 169 | } |
| 170 | |
| 171 | func ExampleDecode_embeddedStruct() { |
| 172 | // Squashing multiple embedded structs is allowed using the squash tag. |
| 173 | // This is demonstrated by creating a composite struct of multiple types |
| 174 | // and decoding into it. In this case, a person can carry with it both |
| 175 | // a Family and a Location, as well as their own FirstName. |
| 176 | type Family struct { |
| 177 | LastName string |
| 178 | } |
| 179 | type Location struct { |
| 180 | City string |
| 181 | } |
| 182 | type Person struct { |
| 183 | Family `mapstructure:",squash"` |
| 184 | Location `mapstructure:",squash"` |
| 185 | FirstName string |
| 186 | } |
| 187 | |
| 188 | input := map[string]interface{}{ |
| 189 | "FirstName": "Mitchell", |
| 190 | "LastName": "Hashimoto", |
| 191 | "City": "San Francisco", |
| 192 | } |
| 193 | |
| 194 | var result Person |
| 195 | err := Decode(input, &result) |
| 196 | if err != nil { |
| 197 | panic(err) |
| 198 | } |
| 199 | |
| 200 | fmt.Printf("%s %s, %s", result.FirstName, result.LastName, result.City) |
| 201 | // Output: |
| 202 | // Mitchell Hashimoto, San Francisco |
| 203 | } |
| 204 | |