File: any.go

package info (click to toggle)
golang-github-graph-gophers-graphql-go 1.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,452 kB
  • sloc: sh: 373; javascript: 21; makefile: 5
file content (126 lines) | stat: -rw-r--r-- 2,614 bytes parent folder | download | duplicates (2)
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)
}