1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
package main
import (
"encoding/json"
"fmt"
"github.com/graph-gophers/graphql-go"
)
type key interface {
isKey()
}
type ProdKey struct {
ID *graphql.ID `json:"id"`
SKU *string `json:"sku"`
Package *string `json:"package"`
Variation *struct {
ID graphql.ID `json:"id"`
} `json:"variation"`
}
type DepProdKey struct {
SKU string `json:"sku"`
Package string `json:"package"`
}
type ProdResKey struct {
Study struct {
ID graphql.ID `json:"caseNumber"`
} `json:"study"`
}
type UserKey struct {
Email graphql.ID `json:"email"`
}
type InvKey struct {
ID graphql.ID `json:"id"`
}
func (ProdKey) isKey() {}
func (DepProdKey) isKey() {}
func (ProdResKey) isKey() {}
func (UserKey) isKey() {}
func (InvKey) isKey() {}
type Any struct {
TypeName string `json:"__typename"`
Key key
}
func (a *Any) UnmarshalJSON(d []byte) error {
var temp struct {
T string `json:"__typename"`
}
err := json.Unmarshal(d, &temp)
if err != nil {
return fmt.Errorf("failed to unmarshal typename: %w", err)
}
a.TypeName = temp.T
switch a.TypeName {
case "DeprecatedProduct":
var p DepProdKey
err := json.Unmarshal(d, &p)
if err != nil {
return fmt.Errorf("failed to unmarshal deprecated product key: %w", err)
}
(*a).Key = p
case "Inventory":
var i InvKey
err := json.Unmarshal(d, &i)
if err != nil {
return fmt.Errorf("failed to unmarshal inventory key: %w", err)
}
(*a).Key = i
case "Product":
var p ProdKey
err := json.Unmarshal(d, &p)
if err != nil {
return fmt.Errorf("failed to unmarshal product key: %w", err)
}
(*a).Key = p
case "ProductResearch":
var r ProdResKey
err := json.Unmarshal(d, &r)
if err != nil {
return fmt.Errorf("failed to unmarshal product research key: %w", err)
}
(*a).Key = r
case "User":
var u UserKey
err := json.Unmarshal(d, &u)
if err != nil {
return fmt.Errorf("failed to unmarshal product key: %w", err)
}
(*a).Key = u
default:
return fmt.Errorf("invalid typename %q", a.TypeName)
}
return nil
}
func (Any) ImplementsGraphQLType(name string) bool {
return name == "_Any"
}
func (a *Any) UnmarshalGraphQL(input interface{}) error {
var data []byte
switch val := input.(type) {
case string: // json wrapped in quotes
v := fmt.Sprint(val) // turns all the `\"` into `"`
data = []byte(v)
case map[string]interface{}:
var err error
data, err = json.Marshal(val)
if err != nil {
return fmt.Errorf("failed to marshal to json: %w", err)
}
default:
return fmt.Errorf("invalid input type %T", input)
}
return json.Unmarshal(data, a)
}
|