1+ use anyhow:: { anyhow, Result } ;
12use core:: time;
23use serde_json:: Value ;
34use std:: {
@@ -11,6 +12,9 @@ use multiversx_sc_meta_lib::print_util::println_green;
1112
1213use super :: system_info:: { get_system_info, SystemInfo } ;
1314
15+ const API_LIMIT_EXCEEDED : & str = "api rate limit exceeded for" ;
16+ const MAX_RETRIES : u64 = 5 ;
17+ const RETRY_DELAY : time:: Duration = time:: Duration :: from_secs ( 2 ) ;
1418const USER_AGENT : & str = "multiversx-sc-meta" ;
1519const SCENARIO_CLI_RELEASES_BASE_URL : & str =
1620 "https://api.github.com/repos/multiversx/mx-chain-scenario-cli-go/releases" ;
@@ -80,11 +84,13 @@ impl ScenarioGoInstaller {
8084 }
8185 }
8286
83- async fn get_scenario_go_release_json ( & self ) -> Result < String , reqwest :: Error > {
87+ async fn get_scenario_go_release_json ( & self ) -> Result < String > {
8488 let release_url = self . release_url ( ) ;
8589 println_green ( format ! ( "Retrieving release info: {release_url}" ) ) ;
8690
87- loop {
91+ let mut wait_time = RETRY_DELAY ;
92+
93+ for i in 0 ..MAX_RETRIES {
8894 let response = reqwest:: Client :: builder ( )
8995 . user_agent ( & self . user_agent )
9096 . build ( ) ?
@@ -94,13 +100,19 @@ impl ScenarioGoInstaller {
94100 . text ( )
95101 . await ?;
96102
97- if !response. contains ( "API rate limit exceeded for" ) {
103+ if !response. to_lowercase ( ) . contains ( API_LIMIT_EXCEEDED ) {
98104 return Ok ( response) ;
99105 }
100106
101- println ! ( "API rate limit exceeded, retrying..." ) ;
102- sleep ( time:: Duration :: from_secs ( 5 ) ) ;
107+ println ! ( "API rate limit exceeded, attempt {i} retrying..." ) ;
108+ sleep ( wait_time) ;
109+ wait_time += RETRY_DELAY ;
103110 }
111+
112+ Err ( anyhow ! (
113+ "Failed to retrieve release info after {} retries" ,
114+ MAX_RETRIES
115+ ) )
104116 }
105117
106118 fn parse_scenario_go_release ( & self , raw_json : & str ) -> ScenarioGoRelease {
0 commit comments