File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -14,14 +14,15 @@ categories = ["api-bindings", "games"]
1414features = [" unknown_variants" ]
1515
1616[features ]
17- default = [" bulk_caching" , " default-tls" ]
17+ default = [" bulk_caching" , " default-tls" , " auto_rate_limit " ]
1818# default = []
1919bulk_caching = [" dep:heck" ]
2020default-tls = [" reqwest/default-tls" ]
2121native-tls = [" reqwest/native-tls" ]
2222rustls-tls = [" reqwest/rustls-tls" ]
2323unknown_variants = []
2424unknown_variants_slim = []
25+ auto_rate_limit = []
2526bin = [" tokio/macros" , " tokio/rt-multi-thread" ]
2627
2728[dependencies ]
Original file line number Diff line number Diff line change 66use std:: convert:: TryFrom ;
77use std:: marker:: PhantomData ;
88
9+ use cfg_if:: cfg_if;
910use httpstatus:: StatusCode ;
1011use reqwest:: header:: { self , HeaderValue } ;
1112use serde:: de:: DeserializeOwned ;
@@ -139,6 +140,19 @@ impl<T: DeserializeOwned> Uri<T> {
139140 }
140141
141142 pub ( crate ) async fn fetch_raw ( & self ) -> crate :: Result < reqwest:: Response > {
143+ // Respect Scryfall's rate limits
144+ cfg_if ! {
145+ if #[ cfg( feature = "auto_rate_limit" ) ] {
146+ let limit = match self . url. path( ) {
147+ "/cards/search" | "/cards/named" | "cards/random" | "/cards/collection" => 500 ,
148+ "/cards/search/" | "/cards/named/" | "cards/random/" | "/cards/collection/" => 500 ,
149+ "/cards/manifest" => 6000 ,
150+ _ => 110 ,
151+ } ;
152+ tokio:: time:: sleep( tokio:: time:: Duration :: from_millis( limit) ) . await ;
153+ }
154+ }
155+
142156 match client ( ) . get ( self . url . clone ( ) ) . send ( ) . await {
143157 Ok ( response) => match response. status ( ) . as_u16 ( ) {
144158 400 ..=599 => Err ( Error :: ScryfallError ( response. json ( ) . await . map_err (
You can’t perform that action at this time.
0 commit comments