add: reflection decoder
This commit is contained in:
63
interfaces/11-reflection-decoder/decoder.go
Normal file
63
interfaces/11-reflection-decoder/decoder.go
Normal file
@@ -0,0 +1,63 @@
|
||||
// For more tutorials: https://blog.learngoprogramming.com
|
||||
//
|
||||
// Copyright © 2018 Inanc Gumus
|
||||
// Learn Go Programming Course
|
||||
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
//
|
||||
|
||||
package main
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
type decoderSchema struct {
|
||||
Category string
|
||||
|
||||
// json.RawMessage is a special type of the json package.
|
||||
// It prevents the json package functions encode/decode
|
||||
// the specific parts of the json data.
|
||||
Item json.RawMessage
|
||||
}
|
||||
|
||||
func decode(data []byte) (list, error) {
|
||||
var schemas []decoderSchema
|
||||
|
||||
if err := json.Unmarshal(data, &schemas); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return toStore(schemas)
|
||||
}
|
||||
|
||||
func toStore(schemas []decoderSchema) (store list, err error) {
|
||||
for _, s := range schemas {
|
||||
p := newProduct(s.Category)
|
||||
|
||||
if json.Unmarshal(s.Item, &p); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
store = append(store, p)
|
||||
}
|
||||
return store, nil
|
||||
}
|
||||
|
||||
func newProduct(category string) item {
|
||||
// for each product you need to open this code
|
||||
// and add a new case.
|
||||
//
|
||||
// dependency injection should be the responsibility
|
||||
// of the user of this function.
|
||||
switch category {
|
||||
case "book":
|
||||
// var b book
|
||||
// return &b
|
||||
return new(book)
|
||||
case "game":
|
||||
return new(game)
|
||||
case "puzzle":
|
||||
return new(puzzle)
|
||||
case "toy":
|
||||
return new(toy)
|
||||
}
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user