Compare commits

..

No commits in common. "main" and "v1.2.0" have entirely different histories.
main ... v1.2.0

12 changed files with 31 additions and 82 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
api_test.go

View File

@ -2,7 +2,7 @@ package anilist
import "context"
func (api *Api) GetAiringSchedule(ctx context.Context, vars AiringScheduleQuery, onError func(error)) *Cursor[AiringSchedule] {
func (api *Api) GetAiringSchedule(ctx context.Context, vars AiringScheduleQuery, onError func(error)) Cursor[AiringSchedule] {
resp := responseObj[*page[AiringSchedule]]{}
return requestPaged(api, ctx, getAiringScheduleQuery, vars.toMap(), &resp, onError)
}

12
api.go
View File

@ -49,10 +49,6 @@ func request[T any](api *Api, query string, vars map[string]interface{}, respObj
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return handleError(resp)
}
//data, _ := ioutil.ReadAll(resp.Body)
//fmt.Println(string(data))
@ -65,7 +61,7 @@ func request[T any](api *Api, query string, vars map[string]interface{}, respObj
return nil
}
func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[string]interface{}, respObj *responseObj[*page[R]], onError func(error)) *Cursor[R] {
func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[string]interface{}, respObj *responseObj[*page[R]], onError func(error)) Cursor[R] {
resp := responseObj[struct {
Page *page[R] `json:"Page"`
}]{}
@ -94,10 +90,6 @@ func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[s
return
}
if resp.Data.Page == nil {
return
}
for _, value := range resp.Data.Page.Data() {
value := value
select {
@ -113,7 +105,7 @@ func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[s
}
}()
return &Cursor[R]{
return Cursor[R]{
Chan: out,
ctx: ctx,
cancelFunc: cancelFunc,

View File

@ -1,32 +0,0 @@
package anilist
import (
"encoding/json"
"errors"
"net/http"
)
type apiError struct {
Message string `json:"message"`
Status int `json:"status"`
}
type apiErrResp struct {
Errors []apiError `json:"errors"`
}
func handleError(resp *http.Response) error {
respObj := &apiErrResp{}
dec := json.NewDecoder(resp.Body)
err := dec.Decode(respObj)
if err != nil {
return err
}
if len(respObj.Errors) == 0 {
return errors.New("unknown API error")
}
return errors.New(respObj.Errors[0].Message)
}

View File

@ -8,16 +8,16 @@ type Cursor[T any] struct {
Chan <-chan *T
}
func (c *Cursor[T]) First() *T {
func (c Cursor[T]) First() *T {
defer c.cancelFunc()
return <-c.Chan
}
func (c *Cursor[T]) Close() {
c.cancelFunc()
func (c Cursor[T]) Close() {
defer c.cancelFunc()
}
func (c *Cursor[T]) Next() (*T, bool) {
func (c Cursor[T]) Next() (*T, bool) {
if c.ctx.Err() == nil {
value, ok := <-c.Chan
return value, ok
@ -26,7 +26,7 @@ func (c *Cursor[T]) Next() (*T, bool) {
return nil, false
}
func (c *Cursor[T]) Slice() []T {
func (c Cursor[T]) Slice() []T {
s := make([]T, 0)
for value, ok := c.Next(); ok; value, ok = c.Next() {
s = append(s, *value)

2
go.mod
View File

@ -1,3 +1,3 @@
module git.tordarus.net/tordarus/anilist
module git.tordarus.net/Tordarus/anilist
go 1.18

0
go.sum Normal file
View File

View File

@ -2,7 +2,7 @@ package anilist
import "context"
func (api *Api) GetMedia(ctx context.Context, vars MediaQuery, onError func(error)) *Cursor[Media] {
func (api *Api) GetMedia(ctx context.Context, vars MediaQuery, onError func(error)) Cursor[Media] {
resp := responseObj[*page[Media]]{}
return requestPaged(api, ctx, getMediaQuery, vars.toMap(), &resp, onError)
}

View File

@ -2,7 +2,7 @@ package anilist
import "context"
func (api *Api) GetMediaList(ctx context.Context, vars MediaListQuery, onError func(error)) *Cursor[MediaList] {
func (api *Api) GetMediaList(ctx context.Context, vars MediaListQuery, onError func(error)) Cursor[MediaList] {
resp := responseObj[*page[MediaList]]{}
return requestPaged(api, ctx, getMediaListQuery, vars.toMap(), &resp, onError)
}

View File

@ -9,10 +9,8 @@ type User struct {
Name string `json:"name,omitempty"`
}
type MediaID int
type Media struct {
ID MediaID `json:"id"`
ID int `json:"id"`
Title MediaTitle `json:"title"`
Type MediaType `json:"type"`
Format MediaFormat `json:"format"`
@ -115,12 +113,10 @@ const (
MediaSourcePictureBook MediaSource = "PICTURE_BOOK"
)
type MediaTrailerID string
type MediaTrailer struct {
ID MediaTrailerID `json:"id"`
Site string `json:"site"`
Thumbnail string `json:"thumbnail"`
ID string `json:"id"`
Site string `json:"site"`
Thumbnail string `json:"thumbnail"`
}
type MediaCoverImage struct {
@ -130,10 +126,8 @@ type MediaCoverImage struct {
Color string `json:"color"`
}
type MediaTagID int
type MediaTag struct {
MediaTagID int `json:"id"`
ID int `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Category string `json:"category"`
@ -179,12 +173,10 @@ func (d Seconds) Duration() time.Duration {
return time.Duration(d) * time.Second
}
type MediaListID int
type MediaList struct {
ID MediaListID `json:"id"`
ID int `json:"id"`
UserID int `json:"userId"`
MediaID MediaID `json:"mediaId"`
MediaID int `json:"mediaId"`
Status MediaListStatus `json:"status"`
Score float64 `json:"score"`
Progress int `json:"progress"`
@ -205,20 +197,18 @@ type MediaList struct {
type MediaListStatus string
const (
MediaListStatusCurrent MediaListStatus = "CURRENT"
MediaListStatusPlanning MediaListStatus = "PLANNING"
MediaListStatusCompleted MediaListStatus = "COMPLETED"
MediaListStatusDropped MediaListStatus = "DROPPED"
MediaListStatusPaused MediaListStatus = "PAUSED"
MediaListStatusRepeating MediaListStatus = "REPEATING"
MediaListStatusCurrent MediaSource = "CURRENT"
MediaListStatusPlanning MediaSource = "PLANNING"
MediaListStatusCompleted MediaSource = "COMPLETED"
MediaListStatusDropped MediaSource = "DROPPED"
MediaListStatusPaused MediaSource = "PAUSED"
MediaListStatusRepeating MediaSource = "REPEATING"
)
type AiringScheduleID int
type AiringSchedule struct {
ID AiringScheduleID `json:"id"`
MediaID MediaID `json:"mediaId"`
AiringAt UnixTime `json:"airingAt"`
TimeUntilAiring Seconds `json:"timeUntilAiring"`
Episode int `json:"episode"`
ID int `json:"id"`
MediaID int `json:"mediaId"`
AiringAt UnixTime `json:"airingAt"`
TimeUntilAiring Seconds `json:"timeUntilAiring"`
Episode int `json:"episode"`
}

View File

@ -44,7 +44,7 @@ func (api *Api) GetUserByID(id int) (*User, error) {
return resp.Data.User, nil
}
func (api *Api) SearchUsers(ctx context.Context, search string, onError func(error)) *Cursor[User] {
func (api *Api) SearchUsers(ctx context.Context, search string, onError func(error)) Cursor[User] {
vars := map[string]interface{}{"search": search}
resp := responseObj[*page[User]]{}
return requestPaged(api, ctx, searchUsersQuery, vars, &resp, onError)

View File

@ -18,7 +18,7 @@ func addValue2InterfaceMap[K, T comparable](m map[K]interface{}, key K, value T)
}
func addSlice2InterfaceMap[K, T comparable](m map[K]interface{}, key K, value []T) {
if len(value) > 0 {
if value != nil && len(value) > 0 {
m[key] = value
}
}