@@ -11,13 +11,24 @@ use reqwest::blocking::Client;
1111use serde_json:: Value ;
1212use std:: fmt:: Debug ;
1313use std:: string:: ToString ;
14+ use std:: sync:: OnceLock ;
1415use std:: thread:: sleep;
1516use std:: time:: Duration ;
1617
1718const ALLOWED_FLAGS : [ & str ; 2 ] = [ "gene_variant" , "mitochondrial" ] ;
1819
20+ static HGVS_RATE_LIMITER : OnceLock < Ratelimiter > = OnceLock :: new ( ) ;
21+
22+ fn hgvs_rate_limiter ( ) -> & ' static Ratelimiter {
23+ HGVS_RATE_LIMITER . get_or_init ( || {
24+ Ratelimiter :: builder ( 2 , Duration :: from_millis ( 1250 ) )
25+ . max_tokens ( 2 )
26+ . build ( )
27+ . expect ( "Building rate limiter failed" )
28+ } )
29+ }
30+
1931pub struct HGVSClient {
20- rate_limiter : Ratelimiter ,
2132 attempts : usize ,
2233 api_url : String ,
2334 client : Client ,
@@ -26,19 +37,9 @@ pub struct HGVSClient {
2637
2738impl Default for HGVSClient {
2839 fn default ( ) -> Self {
29- let rate_limiter = Ratelimiter :: builder ( 2 , Duration :: from_millis ( 1180 ) )
30- . max_tokens ( 2 )
31- . build ( )
32- . expect ( "Building rate limiter failed" ) ;
3340 let api_url =
3441 "https://rest.variantvalidator.org/VariantValidator/variantvalidator/" . to_string ( ) ;
35- HGVSClient :: new (
36- rate_limiter,
37- 3 ,
38- api_url. to_string ( ) ,
39- Client :: new ( ) ,
40- GenomeAssembly :: Hg38 ,
41- )
42+ HGVSClient :: new ( 3 , api_url. to_string ( ) , Client :: new ( ) , GenomeAssembly :: Hg38 )
4243 }
4344}
4445
@@ -55,14 +56,12 @@ impl Debug for HGVSClient {
5556
5657impl HGVSClient {
5758 pub fn new (
58- rate_limiter : Ratelimiter ,
5959 attempts : usize ,
6060 api_url : String ,
6161 client : Client ,
6262 genome_assembly : GenomeAssembly ,
6363 ) -> Self {
6464 HGVSClient {
65- rate_limiter,
6665 attempts,
6766 api_url,
6867 client,
@@ -83,7 +82,7 @@ impl HGVSClient {
8382 unvalidated_hgvs : & str ,
8483 ) -> Result < VariantValidatorResponse , HGVSError > {
8584 for _ in 0 ..self . attempts {
86- if let Err ( duration) = self . rate_limiter . try_wait ( ) {
85+ if let Err ( duration) = hgvs_rate_limiter ( ) . try_wait ( ) {
8786 sleep ( duration) ;
8887 }
8988
@@ -245,49 +244,48 @@ mod tests {
245244 use crate :: hgvs:: traits:: HGVSData ;
246245 use rstest:: { fixture, rstest} ;
247246
248- // this forces tests to run sequentially
249- #[ rstest]
250- fn hgvs_client_tests ( ) {
251- let client = HGVSClient :: default ( ) ;
252- test_request_and_validate_hgvs_c_autosomal ( & client) ;
253- test_request_and_validate_hgvs_c_x ( & client) ;
254- test_request_and_validate_hgvs_n ( & client) ;
255- test_request_and_validate_hgvs_m ( & client) ;
256- test_request_and_validate_hgvs_wrong_reference_base_err ( & client) ;
257- test_request_and_validate_hgvs_not_c_or_n_hgvs_err ( & client) ;
247+ #[ fixture]
248+ fn client ( ) -> HGVSClient {
249+ HGVSClient :: default ( )
258250 }
259251
260- fn test_request_and_validate_hgvs_c_autosomal ( client : & HGVSClient ) {
252+ #[ rstest]
253+ fn test_request_and_validate_hgvs_c_autosomal ( client : HGVSClient ) {
261254 let unvalidated_hgvs = "NM_001173464.1:c.2860C>T" ;
262255 let validated_hgvs = client. request_and_validate_hgvs ( unvalidated_hgvs) . unwrap ( ) ;
263256 assert_eq ! ( validated_hgvs. transcript_hgvs( ) , unvalidated_hgvs) ;
264257 }
265258
266- fn test_request_and_validate_hgvs_c_x ( client : & HGVSClient ) {
259+ #[ rstest]
260+ fn test_request_and_validate_hgvs_c_x ( client : HGVSClient ) {
267261 let unvalidated_hgvs = "NM_000132.4:c.3637A>T" ;
268262 let validated_hgvs = client. request_and_validate_hgvs ( unvalidated_hgvs) . unwrap ( ) ;
269263 assert_eq ! ( validated_hgvs. transcript_hgvs( ) , unvalidated_hgvs) ;
270264 }
271265
272- fn test_request_and_validate_hgvs_n ( client : & HGVSClient ) {
266+ #[ rstest]
267+ fn test_request_and_validate_hgvs_n ( client : HGVSClient ) {
273268 let unvalidated_hgvs = "NR_002196.1:n.601G>T" ;
274269 let validated_hgvs = client. request_and_validate_hgvs ( unvalidated_hgvs) . unwrap ( ) ;
275270 assert_eq ! ( validated_hgvs. transcript_hgvs( ) , unvalidated_hgvs) ;
276271 }
277272
278- fn test_request_and_validate_hgvs_m ( client : & HGVSClient ) {
273+ #[ rstest]
274+ fn test_request_and_validate_hgvs_m ( client : HGVSClient ) {
279275 let unvalidated_hgvs = "NC_012920.1:m.616T>C" ;
280276 let validated_hgvs = client. request_and_validate_hgvs ( unvalidated_hgvs) . unwrap ( ) ;
281277 assert_eq ! ( validated_hgvs. transcript_hgvs( ) , unvalidated_hgvs) ;
282278 }
283279
284- fn test_request_and_validate_hgvs_wrong_reference_base_err ( client : & HGVSClient ) {
280+ #[ rstest]
281+ fn test_request_and_validate_hgvs_wrong_reference_base_err ( client : HGVSClient ) {
285282 let unvalidated_hgvs = "NM_001173464.1:c.2860G>T" ;
286283 let result = client. request_and_validate_hgvs ( unvalidated_hgvs) ;
287284 assert ! ( matches!( result, Err ( HGVSError :: InvalidHgvs { .. } ) ) ) ;
288285 }
289286
290- fn test_request_and_validate_hgvs_not_c_or_n_hgvs_err ( client : & HGVSClient ) {
287+ #[ rstest]
288+ fn test_request_and_validate_hgvs_not_c_or_n_hgvs_err ( client : HGVSClient ) {
291289 let unvalidated_hgvs = "NC_000012.12:g.39332405G>A" ;
292290 let result = client. request_and_validate_hgvs ( unvalidated_hgvs) ;
293291 assert ! ( matches!(
0 commit comments