5 Commits

9 changed files with 39 additions and 29 deletions

View File

@ -2,7 +2,7 @@ package anilist
import "context" 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]]{} resp := responseObj[*page[AiringSchedule]]{}
return requestPaged(api, ctx, getAiringScheduleQuery, vars.toMap(), &resp, onError) return requestPaged(api, ctx, getAiringScheduleQuery, vars.toMap(), &resp, onError)
} }

4
api.go
View File

@ -61,7 +61,7 @@ func request[T any](api *Api, query string, vars map[string]interface{}, respObj
return nil 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 { resp := responseObj[struct {
Page *page[R] `json:"Page"` Page *page[R] `json:"Page"`
}]{} }]{}
@ -105,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, Chan: out,
ctx: ctx, ctx: ctx,
cancelFunc: cancelFunc, cancelFunc: cancelFunc,

View File

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

2
go.mod
View File

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

0
go.sum
View File

View File

@ -2,7 +2,7 @@ package anilist
import "context" 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]]{} resp := responseObj[*page[Media]]{}
return requestPaged(api, ctx, getMediaQuery, vars.toMap(), &resp, onError) return requestPaged(api, ctx, getMediaQuery, vars.toMap(), &resp, onError)
} }

View File

@ -2,7 +2,7 @@ package anilist
import "context" 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]]{} resp := responseObj[*page[MediaList]]{}
return requestPaged(api, ctx, getMediaListQuery, vars.toMap(), &resp, onError) return requestPaged(api, ctx, getMediaListQuery, vars.toMap(), &resp, onError)
} }

View File

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

View File

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