From c4c273888446b4beb215cafc165ecd9365bee357 Mon Sep 17 00:00:00 2001 From: Vidhu Kant Sharma Date: Mon, 31 Jan 2022 12:00:19 +0530 Subject: added error handling for GetAnimeById --- anime/anime.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ anime/util.go | 4 ++-- anime/validators.go | 10 ++++------ 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/anime/anime.go b/anime/anime.go index 2c23209..bad3cf3 100644 --- a/anime/anime.go +++ b/anime/anime.go @@ -4,29 +4,69 @@ import ( "encoding/json" "errors" "fmt" + "log" "strconv" ) -// Each anime has its own ID on MAL -func GetAnimeById(token string, animeId int) Anime { - endpoint := fmt.Sprintf("https://api.myanimelist.net/v2/anime/%d?fields=id,title,main_picture,alternative_titles,start_date,end_date,synopsis,mean,rank,popularity,num_list_users,num_scoring_users,nsfw,created_at,updated_at,media_type,status,genres,my_list_status,num_episodes,start_season,broadcast,source,average_episode_duration,rating,pictures,background,related_anime,related_manga,recommendations,studios,statistics", animeId) +const BASE_URL string = "https://api.myanimelist.net/v2/anime" +// Each anime has its own ID on MAL +func GetAnimeById(token string, animeId int, fields []string) (Anime, error) { var anime Anime + + // Check if given fields are valid + for _, j := range(fields) { + if !isValidField(j) { + return anime, errors.New(fmt.Sprintf("GetAnimeById: Invalid field specified: \"%s\"", j)) + } + } + + // default fields to use when none are specified + defaultFields := []string{ + "id", "title", "main_picture", + "alternative_titles", "start_date", + "end_date", "synopsis", "mean", "rank", + "popularity", "num_list_users", + "num_scoring_users", "nsfw", "created_at", + "updated_at", "media_type", "status", + "genres", "my_list_status", "num_episodes", + "start_season", "broadcast", "source", + "average_episode_duration", "rating", + "pictures", "background", "related_anime", + "related_manga", "recommendations", + "studios", "statistics", + } + + if cap(fields) == 0 { + fields = defaultFields + log.Println("GetAnimeById: WARN: No fields specified, using all default fields to get data") + } + + endpoint, _ := urlGenerator( + BASE_URL + "/" + strconv.Itoa(animeId), + []string{"fields"}, + /* it seems to still return all fields from the API. + * this might be an issue with MAL itself + * TODO: look into this */ + [][]string{fields}, + true, + ) + data := requestHandler(token, endpoint) json.Unmarshal([]byte(data), &anime) - return anime + return anime, nil } // Ranking is a list of anime sorted by their rank func GetAnimeRanking(token string, rankingType string, limit int) (AnimeRanking, error) { var animeRanking AnimeRanking if !isValidRankingType(rankingType) { - return animeRanking, errors.New(fmt.Sprintf("GetAnimeRanking: Invalid Ranking Type Given (\"%s\")", rankingType)) + return animeRanking, errors.New(fmt.Sprintf("GetAnimeRanking: Invalid ranking type specified: \"%s\"", rankingType)) } endpoint, _ := urlGenerator( - "https://api.myanimelist.net/v2/anime/ranking", + BASE_URL + "/ranking", []string{"ranking_type", "limit"}, [][]string{{rankingType}, {strconv.Itoa(limit)}}, true, diff --git a/anime/util.go b/anime/util.go index f09f189..34ba863 100644 --- a/anime/util.go +++ b/anime/util.go @@ -36,7 +36,7 @@ func requestHandler(token string, endpoint string) string { } func urlGenerator(baseUrl string, names []string, values [][]string, isPrimary bool) (string, error) { - // TODO: error if cap(names) != cap(values) + // length of names and values should be same if cap(names) != cap(values) { return "", errors.New("urlGenerator: Error: Length of names and values don't match.") } @@ -50,7 +50,7 @@ func urlGenerator(baseUrl string, names []string, values [][]string, isPrimary b * else it is &nextkey=value */ if isPrimary { data = "?" + name + "=" - } else { + } else { data = "&" + name + "=" } diff --git a/anime/validators.go b/anime/validators.go index 3f66abe..4cf4986 100644 --- a/anime/validators.go +++ b/anime/validators.go @@ -12,14 +12,13 @@ func isValidRankingType(rankingType string) bool { "movie", "special", "bypopularity", - "favorite": - return true + "favorite": return true } return false } // Checks if given rankingType is valid -func areValidFields(field string) bool { +func isValidField(field string) bool { switch field { case "id", @@ -45,7 +44,7 @@ func areValidFields(field string) bool { "start_season", "broadcast", "source", - "avarage_episode_duration", + "average_episode_duration", "rating", "pictures", "background", @@ -53,8 +52,7 @@ func areValidFields(field string) bool { "related_manga", "recommendations", "studios", - "statistics": - return true + "statistics": return true } return false } -- cgit v1.2.3