package e621 import ( "encoding/json" "git.dragse.it/anthrove/e621-to-graph/pkg/e621" pgkError "git.dragse.it/anthrove/e621-to-graph/pkg/error" log "github.com/sirupsen/logrus" "net/http" "reflect" ) type e621APITask[T e621.DataType] struct { uri string } func NewE621ApiTask[T e621.DataType](uri string) e621.Task[T] { log.WithFields(log.Fields{ "uri": uri, "type": reflect.TypeOf(*new(T)), }).Debug("e621: task created") return &e621APITask[T]{ uri: uri, } } func (e e621APITask[T]) UriPath() string { return e.uri } func (e e621APITask[T]) HandleStatusCode(statusCode int) e621.DataResponse[T] { var err error switch statusCode { case 421: err = pgkError.RateLimitReachedError{} case 424: err = pgkError.InvalidParametersError{} case 520: err = pgkError.OriginConnectionTimeOutError{} case 522: err = pgkError.OriginConnectionTimeOutError{} case 524: err = pgkError.OriginConnectionTimeOutError{} case 525: err = pgkError.SSLHandshakeFailedError{} default: err = pgkError.StatusCodesToError(statusCode) } log.WithFields(log.Fields{ "status_code": statusCode, }).Debug("e621: handel status code") return e621.DataResponse[T]{Error: err} } func (e e621APITask[T]) HandleResponse(responseData *http.Response) e621.DataResponse[T] { var data T log.WithFields(log.Fields{ "type": reflect.TypeOf(*new(T)), }).Debug("e621: decoding json response") err := json.NewDecoder(responseData.Body).Decode(&data) defer responseData.Body.Close() if err != nil { return e621.DataResponse[T]{Error: err} } return e621.DataResponse[T]{Data: data} } func (e e621APITask[T]) HandleError(error error) e621.DataResponse[T] { return e621.DataResponse[T]{Error: error} }