@@ -13,7 +13,6 @@ use std::{
1313} ;
1414
1515use moka:: future:: Cache ;
16- use reqwest:: StatusCode ;
1716
1817use super :: {
1918 Queryable ,
@@ -81,8 +80,8 @@ type ItemCache = Cache<(Language, Box<str>), Option<Item>>;
8180#[ derive( Debug , Clone ) ]
8281pub struct Client {
8382 pub ( crate ) http : reqwest:: Client ,
84- pub ( crate ) base_url : String ,
85- pub ( crate ) config : ClientConfig ,
83+ pub ( crate ) base_url : Arc < str > ,
84+ pub ( crate ) config : Arc < ClientConfig > ,
8685 type_cache : TypeCache ,
8786 items_cache : ItemCache ,
8887}
@@ -94,8 +93,8 @@ impl Default for Client {
9493 fn default ( ) -> Self {
9594 Self {
9695 http : reqwest:: Client :: new ( ) ,
97- base_url : "https://api.warframestat.us" . to_owned ( ) ,
98- config : ClientConfig :: default ( ) ,
96+ base_url : "https://api.warframestat.us" . into ( ) ,
97+ config : Arc :: new ( ClientConfig :: default ( ) ) ,
9998 type_cache : Cache :: builder ( )
10099 . time_to_live ( Duration :: from_mins ( 5 ) )
101100 . build ( ) ,
@@ -111,15 +110,15 @@ impl Client {
111110 #[ must_use]
112111 pub fn new (
113112 reqwest_client : reqwest:: Client ,
114- base_url : String ,
113+ base_url : & str ,
115114 config : ClientConfig ,
116115 type_cache : TypeCache ,
117116 items_cache : ItemCache ,
118117 ) -> Self {
119118 Self {
120119 http : reqwest_client,
121- base_url,
122- config,
120+ base_url : base_url . into ( ) ,
121+ config : Arc :: new ( config ) ,
123122 type_cache,
124123 items_cache,
125124 }
@@ -128,7 +127,7 @@ impl Client {
128127 async fn type_cached < T , F > ( & self , language : Language , fallback : F ) -> Result < T :: Return , Error >
129128 where
130129 T : Queryable ,
131- F : AsyncFn ( ) -> Result < T :: Return , Error > ,
130+ F : AsyncFnOnce ( ) -> Result < T :: Return , Error > ,
132131 {
133132 let type_id = TypeId :: of :: < T :: Return > ( ) ;
134133
@@ -178,8 +177,7 @@ impl Client {
178177 where
179178 T : Queryable ,
180179 {
181- self . type_cached :: < T , _ > ( Language :: EN , || T :: query ( & self . base_url , & self . http ) )
182- . await
180+ self . fetch_using_lang :: < T > ( Language :: EN ) . await
183181 }
184182
185183 /// Fetches an instance of a specified model in a supplied Language.
@@ -211,8 +209,8 @@ impl Client {
211209 where
212210 T : Queryable ,
213211 {
214- self . type_cached :: < T , _ > ( language, || {
215- T :: query_with_language ( & self . base_url , & self . http , language)
212+ self . type_cached :: < T , _ > ( language, async || {
213+ T :: query ( & self . base_url . clone ( ) , & self . http . clone ( ) , language) . await
216214 } )
217215 . await
218216 }
@@ -224,7 +222,7 @@ impl Client {
224222 fallback : F ,
225223 ) -> Result < Option < Item > , Error >
226224 where
227- F : AsyncFn ( ) -> Result < Option < Item > , Error > ,
225+ F : AsyncFnOnce ( ) -> Result < Option < Item > , Error > ,
228226 {
229227 let key = ( language, Box :: from ( query) ) ;
230228 if let Some ( item) = self . items_cache . get ( & key) . await {
@@ -270,14 +268,7 @@ impl Client {
270268 /// }
271269 /// ```
272270 pub async fn query_item ( & self , query : & str ) -> Result < Option < Item > , Error > {
273- self . cached_item ( Language :: EN , query, || {
274- self . query_by_url ( format ! (
275- "{}/items/{}/?language=en" ,
276- self . base_url,
277- urlencoding:: encode( query) ,
278- ) )
279- } )
280- . await
271+ self . query_item_using_lang ( query, Language :: EN ) . await
281272 }
282273
283274 /// Queries an item by its name and returns the closest matching item.
@@ -310,28 +301,18 @@ impl Client {
310301 query : & str ,
311302 language : Language ,
312303 ) -> Result < Option < Item > , Error > {
313- self . cached_item ( language, query, || {
314- self . query_by_url ( format ! (
315- "{}/items/{}/?language={}" ,
316- self . base_url,
317- urlencoding:: encode( query) ,
318- language
319- ) )
304+ self . cached_item ( language, query, async move || {
305+ Item :: query (
306+ self . http . clone ( ) ,
307+ format ! (
308+ "{}/items/{}/?language={}" ,
309+ self . base_url,
310+ urlencoding:: encode( query) ,
311+ language
312+ ) ,
313+ )
314+ . await
320315 } )
321316 . await
322317 }
323-
324- async fn query_by_url ( & self , url : String ) -> Result < Option < Item > , Error > {
325- let response = self . http . get ( url) . send ( ) . await ?;
326-
327- if response. status ( ) == StatusCode :: NOT_FOUND {
328- return Ok ( None ) ;
329- }
330-
331- let json = response. text ( ) . await ?;
332-
333- let item = serde_json:: from_str :: < Item > ( & json) ?;
334-
335- Ok ( Some ( item) )
336- }
337318}
0 commit comments