forked from Henry-Sarabia/igdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
collection.go
134 lines (109 loc) · 3.93 KB
/
collection.go
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
127
128
129
130
131
132
133
134
package igdb
import (
"encoding/json"
"github.com/Henry-Sarabia/sliceconv"
"github.com/pkg/errors"
"strconv"
)
//go:generate gomodifytags -file $GOFILE -struct Collection -add-tags json -w
// Collection represents a video game series.
// For more information visit: https://api-docs.igdb.com/#collection
type Collection struct {
ID int `json:"id"`
CreatedAt int `json:"created_at"`
Games []GameWrapper `json:"games"`
Name string `json:"name"`
Slug string `json:"slug"`
UpdatedAt int `json:"updated_at"`
URL string `json:"url"`
}
// CollectionService handles all the API calls for the IGDB Collection endpoint.
type CollectionService service
// Get returns a single Collection identified by the provided IGDB ID. Provide
// the SetFields functional option if you need to specify which fields to
// retrieve. If the ID does not match any Collections, an error is returned.
func (cs *CollectionService) Get(id int, opts ...Option) (*Collection, error) {
if id < 0 {
return nil, ErrNegativeID
}
var col []*Collection
opts = append(opts, SetFilter("id", OpEquals, strconv.Itoa(id)))
err := cs.client.post(cs.end, &col, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Collection with ID %v", id)
}
return col[0], nil
}
// List returns a list of Collections identified by the provided list of IGDB IDs.
// Provide functional options to sort, filter, and paginate the results.
// Any ID that does not match a Collection is ignored. If none of the IDs
// match a Collection, an error is returned.
func (cs *CollectionService) List(ids []int, opts ...Option) ([]*Collection, error) {
for len(ids) < 1 {
return nil, ErrEmptyIDs
}
for _, id := range ids {
if id < 0 {
return nil, ErrNegativeID
}
}
var col []*Collection
opts = append(opts, SetFilter("id", OpContainsAtLeast, sliceconv.Itoa(ids)...))
err := cs.client.post(cs.end, &col, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Collections with IDs %v", ids)
}
return col, nil
}
// Index returns an index of Collections based solely on the provided functional
// options used to sort, filter, and paginate the results. If no Collections can
// be found using the provided options, an error is returned.
func (cs *CollectionService) Index(opts ...Option) ([]*Collection, error) {
var col []*Collection
err := cs.client.post(cs.end, &col, opts...)
if err != nil {
return nil, errors.Wrap(err, "cannot get index of Collections")
}
return col, nil
}
// Search returns a list of Collections found by searching the IGDB using the provided
// query. Provide functional options to sort, filter, and paginate the results. If
// no Collections are found using the provided query, an error is returned.
func (cs *CollectionService) Search(qry string, opts ...Option) ([]*Collection, error) {
var col []*Collection
opts = append(opts, setSearch(qry))
err := cs.client.post(cs.end, &col, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Collection with query %s", qry)
}
return col, nil
}
// Count returns the number of Collections available in the IGDB.
// Provide the SetFilter functional option if you need to filter
// which Collections to count.
func (cs *CollectionService) Count(opts ...Option) (int, error) {
ct, err := cs.client.getCount(cs.end, opts...)
if err != nil {
return 0, errors.Wrap(err, "cannot count Collections")
}
return ct, nil
}
// Fields returns the up-to-date list of fields in an
// IGDB Collection object.
func (cs *CollectionService) Fields() ([]string, error) {
f, err := cs.client.getFields(cs.end)
if err != nil {
return nil, errors.Wrap(err, "cannot get Collection fields")
}
return f, nil
}
type CollectionWrapper struct {
Collection
}
func (c *CollectionWrapper) UnmarshalJSON(data []byte) error {
if id, err := strconv.Atoi(string(data)); err == nil {
c.ID = id
return nil
}
return json.Unmarshal(data, &c.Collection)
}