forked from mirror/Riven
1
0
Fork 0

update error handling

users/mingwei/surf
Mingwei Samuel 2019-10-22 19:33:15 -07:00
parent e62a41983a
commit c3c3e639ee
7 changed files with 70 additions and 72 deletions

View File

@ -1,7 +1,7 @@

// This file is automatically generated.
// Do not directly edit.
// Generated on 2019-10-22T21:42:10.101Z
// Generated on 2019-10-23T01:41:03.103Z
use std::fmt;
use num_derive;

View File

@ -1,7 +1,7 @@
// This file is automatically generated.
// Do not directly edit.
// Generated on 2019-10-22T21:42:10.216Z
// Generated on 2019-10-23T01:41:03.165Z
// http://www.mingweisamuel.com/riotapi-schema/tool/
// Version 0c74167e0eaaeb6de1c7e8219fecaabcf8386d1f
@ -12,9 +12,9 @@ pub use dto::*;
use std::future::Future;
use std::vec::Vec;
use reqwest;
use url::form_urlencoded::Serializer;
use crate::Result;
use crate::consts::Region;
use crate::riot_api::RiotApi;
@ -112,7 +112,7 @@ impl<'a> ChampionMasteryV4<'a> {
/// * `region` - Region to query.
/// * `encryptedSummonerId` - Summoner ID associated with the player
pub fn get_all_champion_masteries(&self, region: Region, encrypted_summoner_id: &str)
-> impl Future<Output = Result<Option<Vec<champion_mastery_v4::ChampionMastery>>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<Vec<champion_mastery_v4::ChampionMastery>>>> + 'a
{
let path_string = format!("/lol/champion-mastery/v4/champion-masteries/by-summoner/{}", encrypted_summoner_id);
self.base.get::<Vec<champion_mastery_v4::ChampionMastery>>("champion-mastery-v4.getAllChampionMasteries", region, path_string, None)
@ -126,7 +126,7 @@ impl<'a> ChampionMasteryV4<'a> {
/// * `championId` - Champion ID to retrieve Champion Mastery for
/// * `encryptedSummonerId` - Summoner ID associated with the player
pub fn get_champion_mastery(&self, region: Region, encrypted_summoner_id: &str, champion_id: i64)
-> impl Future<Output = Result<Option<champion_mastery_v4::ChampionMastery>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<champion_mastery_v4::ChampionMastery>>> + 'a
{
let path_string = format!("/lol/champion-mastery/v4/champion-masteries/by-summoner/{}/by-champion/{}", encrypted_summoner_id, champion_id);
self.base.get::<champion_mastery_v4::ChampionMastery>("champion-mastery-v4.getChampionMastery", region, path_string, None)
@ -139,7 +139,7 @@ impl<'a> ChampionMasteryV4<'a> {
/// * `region` - Region to query.
/// * `encryptedSummonerId` - Summoner ID associated with the player
pub fn get_champion_mastery_score(&self, region: Region, encrypted_summoner_id: &str)
-> impl Future<Output = Result<Option<i32>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<i32>>> + 'a
{
let path_string = format!("/lol/champion-mastery/v4/scores/by-summoner/{}", encrypted_summoner_id);
self.base.get::<i32>("champion-mastery-v4.getChampionMasteryScore", region, path_string, None)
@ -160,7 +160,7 @@ impl<'a> ChampionV3<'a> {
/// # Parameters
/// * `region` - Region to query.
pub fn get_champion_info(&self, region: Region)
-> impl Future<Output = Result<Option<champion_v3::ChampionInfo>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<champion_v3::ChampionInfo>>> + 'a
{
let path_string = "/lol/platform/v3/champion-rotations".to_owned();
self.base.get::<champion_v3::ChampionInfo>("champion-v3.getChampionInfo", region, path_string, None)
@ -185,7 +185,7 @@ impl<'a> LeagueExpV4<'a> {
/// * `division`
/// * `page` (optional) - Starts with page 1.
pub fn get_league_entries(&self, region: Region, division: &str, tier: &str, queue: &str, page: Option<i32>)
-> impl Future<Output = Result<Option<Vec<league_exp_v4::LeagueEntry>>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<Vec<league_exp_v4::LeagueEntry>>>> + 'a
{
let mut query_params = Serializer::new(String::new());
if let Some(page) = page { query_params.append_pair("page", &*page.to_string()); };
@ -210,7 +210,7 @@ impl<'a> LeagueV4<'a> {
/// * `region` - Region to query.
/// * `queue`
pub fn get_challenger_league(&self, region: Region, queue: &str)
-> impl Future<Output = Result<Option<league_v4::LeagueList>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<league_v4::LeagueList>>> + 'a
{
let path_string = format!("/lol/league/v4/challengerleagues/by-queue/{}", queue);
self.base.get::<league_v4::LeagueList>("league-v4.getChallengerLeague", region, path_string, None)
@ -223,7 +223,7 @@ impl<'a> LeagueV4<'a> {
/// * `region` - Region to query.
/// * `encryptedSummonerId`
pub fn get_league_entries_for_summoner(&self, region: Region, encrypted_summoner_id: &str)
-> impl Future<Output = Result<Option<Vec<league_v4::LeagueEntry>>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<Vec<league_v4::LeagueEntry>>>> + 'a
{
let path_string = format!("/lol/league/v4/entries/by-summoner/{}", encrypted_summoner_id);
self.base.get::<Vec<league_v4::LeagueEntry>>("league-v4.getLeagueEntriesForSummoner", region, path_string, None)
@ -239,7 +239,7 @@ impl<'a> LeagueV4<'a> {
/// * `queue` - Note that the queue value must be a valid ranked queue.
/// * `page` (optional) - Starts with page 1.
pub fn get_league_entries(&self, region: Region, queue: &str, tier: &str, division: &str, page: Option<i32>)
-> impl Future<Output = Result<Option<Vec<league_v4::LeagueEntry>>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<Vec<league_v4::LeagueEntry>>>> + 'a
{
let mut query_params = Serializer::new(String::new());
if let Some(page) = page { query_params.append_pair("page", &*page.to_string()); };
@ -255,7 +255,7 @@ impl<'a> LeagueV4<'a> {
/// * `region` - Region to query.
/// * `queue`
pub fn get_grandmaster_league(&self, region: Region, queue: &str)
-> impl Future<Output = Result<Option<league_v4::LeagueList>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<league_v4::LeagueList>>> + 'a
{
let path_string = format!("/lol/league/v4/grandmasterleagues/by-queue/{}", queue);
self.base.get::<league_v4::LeagueList>("league-v4.getGrandmasterLeague", region, path_string, None)
@ -268,7 +268,7 @@ impl<'a> LeagueV4<'a> {
/// * `region` - Region to query.
/// * `leagueId` - The UUID of the league.
pub fn get_league_by_id(&self, region: Region, league_id: &str)
-> impl Future<Output = Result<Option<league_v4::LeagueList>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<league_v4::LeagueList>>> + 'a
{
let path_string = format!("/lol/league/v4/leagues/{}", league_id);
self.base.get::<league_v4::LeagueList>("league-v4.getLeagueById", region, path_string, None)
@ -281,7 +281,7 @@ impl<'a> LeagueV4<'a> {
/// * `region` - Region to query.
/// * `queue`
pub fn get_master_league(&self, region: Region, queue: &str)
-> impl Future<Output = Result<Option<league_v4::LeagueList>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<league_v4::LeagueList>>> + 'a
{
let path_string = format!("/lol/league/v4/masterleagues/by-queue/{}", queue);
self.base.get::<league_v4::LeagueList>("league-v4.getMasterLeague", region, path_string, None)
@ -304,7 +304,7 @@ impl<'a> LolStatusV3<'a> {
/// # Parameters
/// * `region` - Region to query.
pub fn get_shard_data(&self, region: Region)
-> impl Future<Output = Result<Option<lol_status_v3::ShardStatus>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<lol_status_v3::ShardStatus>>> + 'a
{
let path_string = "/lol/status/v3/shard-data".to_owned();
self.base.get::<lol_status_v3::ShardStatus>("lol-status-v3.getShardData", region, path_string, None)
@ -326,7 +326,7 @@ impl<'a> MatchV4<'a> {
/// * `region` - Region to query.
/// * `tournamentCode` - The tournament code.
pub fn get_match_ids_by_tournament_code(&self, region: Region, tournament_code: &str)
-> impl Future<Output = Result<Option<Vec<i64>>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<Vec<i64>>>> + 'a
{
let path_string = format!("/lol/match/v4/matches/by-tournament-code/{}/ids", tournament_code);
self.base.get::<Vec<i64>>("match-v4.getMatchIdsByTournamentCode", region, path_string, None)
@ -339,7 +339,7 @@ impl<'a> MatchV4<'a> {
/// * `region` - Region to query.
/// * `matchId` - The match ID.
pub fn get_match(&self, region: Region, match_id: i64)
-> impl Future<Output = Result<Option<match_v4::Match>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<match_v4::Match>>> + 'a
{
let path_string = format!("/lol/match/v4/matches/{}", match_id);
self.base.get::<match_v4::Match>("match-v4.getMatch", region, path_string, None)
@ -353,7 +353,7 @@ impl<'a> MatchV4<'a> {
/// * `tournamentCode` - The tournament code.
/// * `matchId` - The match ID.
pub fn get_match_by_tournament_code(&self, region: Region, match_id: i64, tournament_code: &str)
-> impl Future<Output = Result<Option<match_v4::Match>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<match_v4::Match>>> + 'a
{
let path_string = format!("/lol/match/v4/matches/{}/by-tournament-code/{}", match_id, tournament_code);
self.base.get::<match_v4::Match>("match-v4.getMatchByTournamentCode", region, path_string, None)
@ -379,7 +379,7 @@ impl<'a> MatchV4<'a> {
/// * `endIndex` (optional) - The end index to use for filtering matchlist. If beginIndex is specified, but not endIndex, then endIndex defaults to beginIndex+100. If endIndex is specified, but not beginIndex, then beginIndex defaults to 0. If both are specified, then endIndex must be greater than beginIndex. The maximum range allowed is 100, otherwise a 400 error code is returned.
/// * `beginIndex` (optional) - The begin index to use for filtering matchlist. If beginIndex is specified, but not endIndex, then endIndex defaults to beginIndex+100. If endIndex is specified, but not beginIndex, then beginIndex defaults to 0. If both are specified, then endIndex must be greater than beginIndex. The maximum range allowed is 100, otherwise a 400 error code is returned.
pub fn get_matchlist(&self, region: Region, encrypted_account_id: &str, champion: Option<std::vec::Vec<i32>>, queue: Option<std::vec::Vec<i32>>, season: Option<std::vec::Vec<i32>>, end_time: Option<i64>, begin_time: Option<i64>, end_index: Option<i32>, begin_index: Option<i32>)
-> impl Future<Output = Result<Option<match_v4::Matchlist>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<match_v4::Matchlist>>> + 'a
{
let mut query_params = Serializer::new(String::new());
if let Some(champion) = champion { query_params.extend_pairs(champion.iter().map(|w| ("champion", w.to_string()))); };
@ -403,7 +403,7 @@ impl<'a> MatchV4<'a> {
/// * `region` - Region to query.
/// * `matchId` - The match ID.
pub fn get_match_timeline(&self, region: Region, match_id: i64)
-> impl Future<Output = Result<Option<match_v4::MatchTimeline>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<match_v4::MatchTimeline>>> + 'a
{
let path_string = format!("/lol/match/v4/timelines/by-match/{}", match_id);
self.base.get::<match_v4::MatchTimeline>("match-v4.getMatchTimeline", region, path_string, None)
@ -425,7 +425,7 @@ impl<'a> SpectatorV4<'a> {
/// * `region` - Region to query.
/// * `encryptedSummonerId` - The ID of the summoner.
pub fn get_current_game_info_by_summoner(&self, region: Region, encrypted_summoner_id: &str)
-> impl Future<Output = Result<Option<spectator_v4::CurrentGameInfo>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<spectator_v4::CurrentGameInfo>>> + 'a
{
let path_string = format!("/lol/spectator/v4/active-games/by-summoner/{}", encrypted_summoner_id);
self.base.get::<spectator_v4::CurrentGameInfo>("spectator-v4.getCurrentGameInfoBySummoner", region, path_string, None)
@ -437,7 +437,7 @@ impl<'a> SpectatorV4<'a> {
/// # Parameters
/// * `region` - Region to query.
pub fn get_featured_games(&self, region: Region)
-> impl Future<Output = Result<Option<spectator_v4::FeaturedGames>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<spectator_v4::FeaturedGames>>> + 'a
{
let path_string = "/lol/spectator/v4/featured-games".to_owned();
self.base.get::<spectator_v4::FeaturedGames>("spectator-v4.getFeaturedGames", region, path_string, None)
@ -459,7 +459,7 @@ impl<'a> SummonerV4<'a> {
/// * `region` - Region to query.
/// * `encryptedAccountId`
pub fn get_by_account_id(&self, region: Region, encrypted_account_id: &str)
-> impl Future<Output = Result<Option<summoner_v4::Summoner>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<summoner_v4::Summoner>>> + 'a
{
let path_string = format!("/lol/summoner/v4/summoners/by-account/{}", encrypted_account_id);
self.base.get::<summoner_v4::Summoner>("summoner-v4.getByAccountId", region, path_string, None)
@ -472,7 +472,7 @@ impl<'a> SummonerV4<'a> {
/// * `region` - Region to query.
/// * `summonerName` - Summoner Name
pub fn get_by_summoner_name(&self, region: Region, summoner_name: &str)
-> impl Future<Output = Result<Option<summoner_v4::Summoner>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<summoner_v4::Summoner>>> + 'a
{
let path_string = format!("/lol/summoner/v4/summoners/by-name/{}", summoner_name);
self.base.get::<summoner_v4::Summoner>("summoner-v4.getBySummonerName", region, path_string, None)
@ -485,7 +485,7 @@ impl<'a> SummonerV4<'a> {
/// * `region` - Region to query.
/// * `encryptedPUUID` - Summoner ID
pub fn get_by_puuid(&self, region: Region, encrypted_puuid: &str)
-> impl Future<Output = Result<Option<summoner_v4::Summoner>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<summoner_v4::Summoner>>> + 'a
{
let path_string = format!("/lol/summoner/v4/summoners/by-puuid/{}", encrypted_puuid);
self.base.get::<summoner_v4::Summoner>("summoner-v4.getByPUUID", region, path_string, None)
@ -498,7 +498,7 @@ impl<'a> SummonerV4<'a> {
/// * `region` - Region to query.
/// * `encryptedSummonerId` - Summoner ID
pub fn get_by_summoner_id(&self, region: Region, encrypted_summoner_id: &str)
-> impl Future<Output = Result<Option<summoner_v4::Summoner>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<summoner_v4::Summoner>>> + 'a
{
let path_string = format!("/lol/summoner/v4/summoners/{}", encrypted_summoner_id);
self.base.get::<summoner_v4::Summoner>("summoner-v4.getBySummonerId", region, path_string, None)
@ -520,7 +520,7 @@ impl<'a> ThirdPartyCodeV4<'a> {
/// * `region` - Region to query.
/// * `encryptedSummonerId`
pub fn get_third_party_code_by_summoner_id(&self, region: Region, encrypted_summoner_id: &str)
-> impl Future<Output = Result<Option<String>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<String>>> + 'a
{
let path_string = format!("/lol/platform/v4/third-party-code/by-summoner/{}", encrypted_summoner_id);
self.base.get::<String>("third-party-code-v4.getThirdPartyCodeBySummonerId", region, path_string, None)
@ -542,7 +542,7 @@ impl<'a> TournamentStubV4<'a> {
/// * `region` - Region to query.
/// * `tournamentCode` - The short code to look up lobby events for
pub fn get_lobby_events_by_code(&self, region: Region, tournament_code: &str)
-> impl Future<Output = Result<Option<tournament_stub_v4::LobbyEventWrapper>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<tournament_stub_v4::LobbyEventWrapper>>> + 'a
{
let path_string = format!("/lol/tournament-stub/v4/lobby-events/by-code/{}", tournament_code);
self.base.get::<tournament_stub_v4::LobbyEventWrapper>("tournament-stub-v4.getLobbyEventsByCode", region, path_string, None)
@ -564,7 +564,7 @@ impl<'a> TournamentV4<'a> {
/// * `region` - Region to query.
/// * `tournamentCode` - The tournament code string.
pub fn get_tournament_code(&self, region: Region, tournament_code: &str)
-> impl Future<Output = Result<Option<tournament_v4::TournamentCode>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<tournament_v4::TournamentCode>>> + 'a
{
let path_string = format!("/lol/tournament/v4/codes/{}", tournament_code);
self.base.get::<tournament_v4::TournamentCode>("tournament-v4.getTournamentCode", region, path_string, None)
@ -577,7 +577,7 @@ impl<'a> TournamentV4<'a> {
/// * `region` - Region to query.
/// * `tournamentCode` - The short code to look up lobby events for
pub fn get_lobby_events_by_code(&self, region: Region, tournament_code: &str)
-> impl Future<Output = Result<Option<tournament_v4::LobbyEventWrapper>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<tournament_v4::LobbyEventWrapper>>> + 'a
{
let path_string = format!("/lol/tournament/v4/lobby-events/by-code/{}", tournament_code);
self.base.get::<tournament_v4::LobbyEventWrapper>("tournament-v4.getLobbyEventsByCode", region, path_string, None)

View File

@ -1,7 +1,7 @@
// This file is automatically generated.
// Do not directly edit.
// Generated on 2019-10-22T21:42:10.207Z
// Generated on 2019-10-23T01:41:03.173Z
// http://www.mingweisamuel.com/riotapi-schema/tool/
// Version 0c74167e0eaaeb6de1c7e8219fecaabcf8386d1f

View File

@ -1,3 +1,6 @@
pub use reqwest::Error as Error;
pub use reqwest::Result as Result;
pub mod consts;
pub mod endpoints;
@ -44,7 +47,7 @@ mod tests {
let my_future = riot_api.champion_mastery_v4().get_all_champion_masteries(
consts::Region::NA, "SBM8Ubipo4ge2yj7bhEzL7yvV0C9Oc1XA2l6v5okGMA_nCw");
let val = rt.block_on(my_future).unwrap();
println!("VAL {}: {:#?}", i, val.unwrap());
//println!("VAL {}: {:#?}", i, val.unwrap());
}
}
}

View File

@ -1,9 +1,11 @@
use std::future::Future;
use std::sync::Arc;
use log;
use reqwest::{ Client, StatusCode, Url };
use tokio_timer::delay_for;
use crate::Result;
use crate::riot_api_config::RiotApiConfig;
use crate::consts::Region;
use crate::util::InsertOnlyCHashMap;
@ -12,9 +14,6 @@ use super::RateLimit;
use super::RateLimitType;
pub struct RegionalRequester {
/// Represents the app rate limit.
app_rate_limit: RateLimit,
/// Represents method rate limits.
@ -39,15 +38,13 @@ impl RegionalRequester {
pub fn get<'a, T: serde::de::DeserializeOwned>(self: Arc<Self>,
config: &'a RiotApiConfig, client: &'a Client,
method_id: &'static str, region: Region, path: String, query: Option<String>)
-> impl Future<Output = Result<Option<T>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<T>>> + 'a
{
async move {
let query = query.as_deref();
let mut attempts: u8 = 0;
for _ in 0..=config.retries {
attempts += 1;
let mut retries: u8 = 0;
loop {
let method_rate_limit: Arc<RateLimit> = self.method_rate_limits
.get_or_insert_with(method_id, || RateLimit::new(RateLimitType::Method));
@ -63,15 +60,10 @@ impl RegionalRequester {
url.set_path(&*path);
url.set_query(query);
let result = client.get(url)
let response = client.get(url)
.header(Self::RIOT_KEY_HEADER, &*config.api_key)
.send()
.await;
let response = match result {
Err(e) => return Err(e),
Ok(r) => r,
};
.await?;
// Maybe update rate limits (based on response headers).
self.app_rate_limit.on_response(&response);
@ -79,30 +71,33 @@ impl RegionalRequester {
// Handle response.
let status = response.status();
// Success, return None.
log::trace!("Response {} (retried {} times).", status, retries);
// Special "none success" cases, return None.
if Self::is_none_status_code(&status) {
return Ok(None);
break Ok(None);
}
// Success, return a value.
if status.is_success() {
// Handle normal success / failure cases.
match response.error_for_status_ref() {
// Success.
Ok(_) => {
let value = response.json::<T>().await;
return match value {
Err(e) => Err(e),
Ok(v) => Ok(Some(v)),
break value.map(|v| Some(v));
},
// Failure, may or may not be retryable.
Err(err) => {
// Not-retryable: no more retries or 4xx or ? (3xx, redirects exceeded).
// Retryable: retries remaining, and 429 or 5xx.
if retries >= config.retries ||
(StatusCode::TOO_MANY_REQUESTS != status
&& !status.is_server_error())
{
break Err(err);
}
},
};
retries += 1;
}
// Retryable.
if StatusCode::TOO_MANY_REQUESTS == status || status.is_server_error() {
continue;
}
// Failure (non-retryable).
if status.is_client_error() {
break;
}
panic!("NOT HANDLED: {}!", status);
}
// TODO: return error.
panic!("FAILED AFTER {} ATTEMPTS!", attempts);
}
}

View File

@ -1,6 +1,6 @@
use std::future::Future;
use log::*;
use log;
use reqwest::Client;
use crate::RiotApiConfig;
@ -20,7 +20,7 @@ pub struct RiotApi {
impl RiotApi {
pub fn with_config(config: RiotApiConfig) -> Self {
trace!("Creating client (TODO: configuration).");
log::trace!("Creating client (TODO: configuration).");
Self {
config: config,
client: Client::new(),

View File

@ -15,9 +15,9 @@ pub use dto::*;
use std::future::Future;
use std::vec::Vec;
use reqwest;
use url::form_urlencoded::Serializer;
use crate::Result;
use crate::consts::Region;
use crate::riot_api::RiotApi;
@ -133,7 +133,7 @@ impl<'a> {{= endpoint }}<'a> {
}
}}
pub fn {{= method }}(&self, region: Region{{= argBuilder.join('') }})
-> impl Future<Output = Result<Option<{{= returnType }}>, reqwest::Error>> + 'a
-> impl Future<Output = Result<Option<{{= returnType }}>>> + 'a
{
{{? queryParams.length }}
let mut query_params = Serializer::new(String::new());