-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathcharacter.go
152 lines (124 loc) · 4.49 KB
/
character.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
144
145
146
147
148
149
150
151
152
package igdb
import (
"github.com/Henry-Sarabia/sliceconv"
"github.com/pkg/errors"
"strconv"
)
//go:generate gomodifytags -file $GOFILE -struct Character -add-tags json -w
// Character represents a video game character.
// For more information visit: https://api-docs.igdb.com/#character
type Character struct {
ID int `json:"ID"`
AKAS []string `json:"akas"`
CountryName string `json:"country_name"`
CreatedAt int `json:"created_at"`
Description string `json:"description"`
Games []int `json:"games"`
Gender CharacterGender `json:"gender"`
MugShot int `json:"mug_shot"`
Name string `json:"name"`
People []int `json:"people"`
Slug string `json:"slug"`
Species CharacterSpecies `json:"species"`
UpdatedAt int `json:"updated_at"`
URL string `json:"url"`
}
// CharacterGender specifies a specific gender.
type CharacterGender int
//go:generate stringer -type=CharacterGender,CharacterSpecies
// Expected CharacterGender enums from the IGDB.
const (
GenderMale CharacterGender = iota + 1
GenderFemale
GenderOther
)
// CharacterSpecies specifies a specific species.
type CharacterSpecies int
// Expected CharacterSpecies enums from the IGDB.
const (
SpeciesHuman CharacterSpecies = iota + 1
SpeciesAlien
SpeciesAnimal
SpeciesAndroid
SpeciesUnknown
)
// CharacterService handles all the API calls for the IGDB Character endpoint.
type CharacterService service
// Get returns a single Character 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 Characters, an error is returned.
func (cs *CharacterService) Get(id int, opts ...Option) (*Character, error) {
if id < 0 {
return nil, ErrNegativeID
}
var ch []*Character
opts = append(opts, SetFilter("id", OpEquals, strconv.Itoa(id)))
err := cs.client.post(cs.end, &ch, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Character with ID %v", id)
}
return ch[0], nil
}
// List returns a list of Characters 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 Character is ignored. If none of the IDs
// match a Character, an error is returned.
func (cs *CharacterService) List(ids []int, opts ...Option) ([]*Character, error) {
for len(ids) < 1 {
return nil, ErrEmptyIDs
}
for _, id := range ids {
if id < 0 {
return nil, ErrNegativeID
}
}
var ch []*Character
opts = append(opts, SetFilter("id", OpContainsAtLeast, sliceconv.Itoa(ids)...))
err := cs.client.post(cs.end, &ch, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Characters with IDs %v", ids)
}
return ch, nil
}
// Index returns an index of Characters based solely on the provided functional
// options used to sort, filter, and paginate the results. If no Characters can
// be found using the provided options, an error is returned.
func (cs *CharacterService) Index(opts ...Option) ([]*Character, error) {
var ch []*Character
err := cs.client.post(cs.end, &ch, opts...)
if err != nil {
return nil, errors.Wrap(err, "cannot get index of Characters")
}
return ch, nil
}
// Search returns a list of Characters found by searching the IGDB using the provided
// query. Provide functional options to sort, filter, and paginate the results. If
// no Characters are found using the provided query, an error is returned.
func (cs *CharacterService) Search(qry string, opts ...Option) ([]*Character, error) {
var ch []*Character
opts = append(opts, setSearch(qry))
err := cs.client.post(cs.end, &ch, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Character with query %s", qry)
}
return ch, nil
}
// Count returns the number of Characters available in the IGDB.
// Provide the SetFilter functional option if you need to filter
// which Characters to count.
func (cs *CharacterService) Count(opts ...Option) (int, error) {
ct, err := cs.client.getCount(cs.end, opts...)
if err != nil {
return 0, errors.Wrap(err, "cannot count Characters")
}
return ct, nil
}
// Fields returns the up-to-date list of fields in an
// IGDB Character object.
func (cs *CharacterService) Fields() ([]string, error) {
f, err := cs.client.getFields(cs.end)
if err != nil {
return nil, errors.Wrap(err, "cannot get Character fields")
}
return f, nil
}