-
Notifications
You must be signed in to change notification settings - Fork 17
/
releasedate.go
143 lines (118 loc) · 4.02 KB
/
releasedate.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
135
136
137
138
139
140
141
142
143
package igdb
import (
"github.com/Henry-Sarabia/sliceconv"
"github.com/pkg/errors"
"strconv"
)
//go:generate gomodifytags -file $GOFILE -struct ReleaseDate -add-tags json -w
// ReleaseDate represents the release date for a particular game.
// Used to dig deeper into release dates, platforms, and versions.
// For more information visit: https://api-docs.igdb.com/#release-date
type ReleaseDate struct {
ID int `json:"id"`
Category DateCategory `json:"category"`
CreatedAt int `json:"created_at"`
Date int `json:"date"`
Game int `json:"game"`
Human string `json:"human"`
M int `json:"m"`
Platform int `json:"platform"`
Region RegionCategory `json:"region"`
UpdatedAt int `json:"updated_at"`
Y int `json:"y"`
}
//go:generate stringer -type=DateCategory,RegionCategory
// DateCategory specifies the format of a release date.
type DateCategory int
// Expected DateCategory enums from the IGDB.
const (
DateYYYYMMMMDD DateCategory = iota
DateYYYYMMMM
DateYYYY
DateYYYYQ1
DateYYYYQ2
DateYYYYQ3
DateYYYYQ4
DateTBD
)
// RegionCategory specifies a specific geographic region.
type RegionCategory int
// Expected RegionCategory enums from the IGDB.
const (
RegionEurope RegionCategory = iota + 1
RegionNorthAmerica
RegionAustralia
RegionNewZealand
RegionJapan
RegionChina
RegionAsia
RegionWorldwide
)
// ReleaseDateService handles all the API calls for the IGDB ReleaseDate endpoint.
type ReleaseDateService service
// Get returns a single ReleaseDate 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 ReleaseDates, an error is returned.
func (rs *ReleaseDateService) Get(id int, opts ...Option) (*ReleaseDate, error) {
if id < 0 {
return nil, ErrNegativeID
}
var date []*ReleaseDate
opts = append(opts, SetFilter("id", OpEquals, strconv.Itoa(id)))
err := rs.client.post(rs.end, &date, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get ReleaseDate with ID %v", id)
}
return date[0], nil
}
// List returns a list of ReleaseDates 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 ReleaseDate is ignored. If none of the IDs
// match a ReleaseDate, an error is returned.
func (rs *ReleaseDateService) List(ids []int, opts ...Option) ([]*ReleaseDate, error) {
for len(ids) < 1 {
return nil, ErrEmptyIDs
}
for _, id := range ids {
if id < 0 {
return nil, ErrNegativeID
}
}
var date []*ReleaseDate
opts = append(opts, SetFilter("id", OpContainsAtLeast, sliceconv.Itoa(ids)...))
err := rs.client.post(rs.end, &date, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get ReleaseDates with IDs %v", ids)
}
return date, nil
}
// Index returns an index of ReleaseDates based solely on the provided functional
// options used to sort, filter, and paginate the results. If no ReleaseDates can
// be found using the provided options, an error is returned.
func (rs *ReleaseDateService) Index(opts ...Option) ([]*ReleaseDate, error) {
var date []*ReleaseDate
err := rs.client.post(rs.end, &date, opts...)
if err != nil {
return nil, errors.Wrap(err, "cannot get index of ReleaseDates")
}
return date, nil
}
// Count returns the number of ReleaseDates available in the IGDB.
// Provide the SetFilter functional option if you need to filter
// which ReleaseDates to count.
func (rs *ReleaseDateService) Count(opts ...Option) (int, error) {
ct, err := rs.client.getCount(rs.end, opts...)
if err != nil {
return 0, errors.Wrap(err, "cannot count ReleaseDates")
}
return ct, nil
}
// Fields returns the up-to-date list of fields in an
// IGDB ReleaseDate object.
func (rs *ReleaseDateService) Fields() ([]string, error) {
f, err := rs.client.getFields(rs.end)
if err != nil {
return nil, errors.Wrap(err, "cannot get ReleaseDate fields")
}
return f, nil
}