@@ -9,7 +9,7 @@ use time::{Date, OffsetDateTime};
9
9
10
10
use crate :: contracts:: Contract ;
11
11
use crate :: messages:: { IncomingMessages , RequestMessage , ResponseMessage } ;
12
- use crate :: transport:: InternalSubscription ;
12
+ use crate :: transport:: { InternalSubscription , Response } ;
13
13
use crate :: { server_versions, Client , Error , ToField } ;
14
14
15
15
mod decoders;
@@ -339,30 +339,32 @@ pub(crate) fn historical_data(
339
339
) ?;
340
340
}
341
341
342
- let request_id = client. next_request_id ( ) ;
343
- let request = encoders:: encode_request_historical_data (
344
- client. server_version ( ) ,
345
- request_id,
346
- contract,
347
- end_date,
348
- duration,
349
- bar_size,
350
- what_to_show,
351
- use_rth,
352
- false ,
353
- Vec :: < crate :: contracts:: TagValue > :: default ( ) ,
354
- ) ?;
342
+ loop {
343
+ let request_id = client. next_request_id ( ) ;
344
+ let request = encoders:: encode_request_historical_data (
345
+ client. server_version ( ) ,
346
+ request_id,
347
+ contract,
348
+ end_date,
349
+ duration,
350
+ bar_size,
351
+ what_to_show,
352
+ use_rth,
353
+ false ,
354
+ Vec :: < crate :: contracts:: TagValue > :: default ( ) ,
355
+ ) ?;
355
356
356
- let subscription = client. send_request ( request_id, request) ?;
357
+ let subscription = client. send_request ( request_id, request) ?;
357
358
358
- match subscription. next ( ) {
359
- Some ( Ok ( mut message) ) if message. message_type ( ) == IncomingMessages :: HistoricalData => {
360
- Ok ( decoders:: decode_historical_data ( client. server_version , time_zone ( client) , & mut message) ?)
359
+ match subscription. next ( ) {
360
+ Some ( Ok ( mut message) ) if message. message_type ( ) == IncomingMessages :: HistoricalData => {
361
+ return decoders:: decode_historical_data ( client. server_version , time_zone ( client) , & mut message)
362
+ }
363
+ Some ( Ok ( message) ) => return Err ( Error :: UnexpectedResponse ( message) ) ,
364
+ Some ( Err ( Error :: ConnectionReset ) ) => continue ,
365
+ Some ( Err ( e) ) => return Err ( e) ,
366
+ None => return Err ( Error :: UnexpectedEndOfStream ) ,
361
367
}
362
- Some ( Ok ( message) ) => Err ( Error :: UnexpectedResponse ( message) ) ,
363
- Some ( Err ( Error :: ConnectionReset ) ) => historical_data ( client, contract, end_date, duration, bar_size, what_to_show, use_rth) ,
364
- Some ( Err ( e) ) => Err ( e) ,
365
- None => Err ( Error :: UnexpectedEndOfStream ) ,
366
368
}
367
369
}
368
370
@@ -393,30 +395,32 @@ pub(crate) fn historical_schedule(
393
395
"It does not support requesting of historical schedule." ,
394
396
) ?;
395
397
396
- let request_id = client. next_request_id ( ) ;
397
- let request = encoders:: encode_request_historical_data (
398
- client. server_version ( ) ,
399
- request_id,
400
- contract,
401
- end_date,
402
- duration,
403
- BarSize :: Day ,
404
- Some ( WhatToShow :: Schedule ) ,
405
- true ,
406
- false ,
407
- Vec :: < crate :: contracts:: TagValue > :: default ( ) ,
408
- ) ?;
398
+ loop {
399
+ let request_id = client. next_request_id ( ) ;
400
+ let request = encoders:: encode_request_historical_data (
401
+ client. server_version ( ) ,
402
+ request_id,
403
+ contract,
404
+ end_date,
405
+ duration,
406
+ BarSize :: Day ,
407
+ Some ( WhatToShow :: Schedule ) ,
408
+ true ,
409
+ false ,
410
+ Vec :: < crate :: contracts:: TagValue > :: default ( ) ,
411
+ ) ?;
409
412
410
- let subscription = client. send_request ( request_id, request) ?;
413
+ let subscription = client. send_request ( request_id, request) ?;
411
414
412
- match subscription. next ( ) {
413
- Some ( Ok ( mut message) ) if message. message_type ( ) == IncomingMessages :: HistoricalSchedule => {
414
- Ok ( decoders:: decode_historical_schedule ( & mut message) ?)
415
+ match subscription. next ( ) {
416
+ Some ( Ok ( mut message) ) if message. message_type ( ) == IncomingMessages :: HistoricalSchedule => {
417
+ return decoders:: decode_historical_schedule ( & mut message)
418
+ }
419
+ Some ( Ok ( message) ) => return Err ( Error :: UnexpectedResponse ( message) ) ,
420
+ Some ( Err ( Error :: ConnectionReset ) ) => continue ,
421
+ Some ( Err ( e) ) => return Err ( e) ,
422
+ None => return Err ( Error :: UnexpectedEndOfStream ) ,
415
423
}
416
- Some ( Ok ( message) ) => Err ( Error :: UnexpectedResponse ( message) ) ,
417
- Some ( Err ( Error :: ConnectionReset ) ) => historical_schedule ( client, contract, end_date, duration) ,
418
- Some ( Err ( e) ) => Err ( e) ,
419
- None => Err ( Error :: UnexpectedEndOfStream ) ,
420
424
}
421
425
}
422
426
@@ -432,7 +436,7 @@ pub(crate) fn historical_ticks_bid_ask(
432
436
client. check_server_version ( server_versions:: HISTORICAL_TICKS , "It does not support historical ticks request." ) ?;
433
437
434
438
let request_id = client. next_request_id ( ) ;
435
- let message = encoders:: encode_request_historical_ticks (
439
+ let request = encoders:: encode_request_historical_ticks (
436
440
request_id,
437
441
contract,
438
442
start,
@@ -442,10 +446,9 @@ pub(crate) fn historical_ticks_bid_ask(
442
446
use_rth,
443
447
ignore_size,
444
448
) ?;
449
+ let subscription = client. send_request ( request_id, request) ?;
445
450
446
- let messages = client. send_request ( request_id, message) ?;
447
-
448
- Ok ( TickSubscription :: new ( messages) )
451
+ Ok ( TickSubscription :: new ( subscription) )
449
452
}
450
453
451
454
pub ( crate ) fn historical_ticks_mid_point (
@@ -459,11 +462,10 @@ pub(crate) fn historical_ticks_mid_point(
459
462
client. check_server_version ( server_versions:: HISTORICAL_TICKS , "It does not support historical ticks request." ) ?;
460
463
461
464
let request_id = client. next_request_id ( ) ;
462
- let message = encoders:: encode_request_historical_ticks ( request_id, contract, start, end, number_of_ticks, WhatToShow :: MidPoint , use_rth, false ) ?;
463
-
464
- let messages = client. send_request ( request_id, message) ?;
465
+ let request = encoders:: encode_request_historical_ticks ( request_id, contract, start, end, number_of_ticks, WhatToShow :: MidPoint , use_rth, false ) ?;
466
+ let subscription = client. send_request ( request_id, request) ?;
465
467
466
- Ok ( TickSubscription :: new ( messages ) )
468
+ Ok ( TickSubscription :: new ( subscription ) )
467
469
}
468
470
469
471
pub ( crate ) fn historical_ticks_trade (
@@ -477,25 +479,26 @@ pub(crate) fn historical_ticks_trade(
477
479
client. check_server_version ( server_versions:: HISTORICAL_TICKS , "It does not support historical ticks request." ) ?;
478
480
479
481
let request_id = client. next_request_id ( ) ;
480
- let message = encoders:: encode_request_historical_ticks ( request_id, contract, start, end, number_of_ticks, WhatToShow :: Trades , use_rth, false ) ?;
481
-
482
- let messages = client. send_request ( request_id, message) ?;
482
+ let request = encoders:: encode_request_historical_ticks ( request_id, contract, start, end, number_of_ticks, WhatToShow :: Trades , use_rth, false ) ?;
483
+ let subscription = client. send_request ( request_id, request) ?;
483
484
484
- Ok ( TickSubscription :: new ( messages ) )
485
+ Ok ( TickSubscription :: new ( subscription ) )
485
486
}
486
487
487
488
pub ( crate ) fn histogram_data ( client : & Client , contract : & Contract , use_rth : bool , period : BarSize ) -> Result < Vec < HistogramEntry > , Error > {
488
489
client. check_server_version ( server_versions:: REQ_HISTOGRAM , "It does not support histogram data requests." ) ?;
489
490
490
- let request_id = client . next_request_id ( ) ;
491
- let message = encoders :: encode_request_histogram_data ( request_id , contract , use_rth , period ) ? ;
492
-
493
- let subscription = client. send_request ( request_id, message ) ?;
491
+ loop {
492
+ let request_id = client . next_request_id ( ) ;
493
+ let request = encoders :: encode_request_histogram_data ( request_id , contract , use_rth , period ) ? ;
494
+ let subscription = client. send_request ( request_id, request ) ?;
494
495
495
- match subscription. next ( ) {
496
- Some ( Ok ( mut message) ) => decoders:: decode_histogram_data ( & mut message) ,
497
- Some ( Err ( e) ) => Err ( e) ,
498
- None => Ok ( Vec :: new ( ) ) ,
496
+ match subscription. next ( ) {
497
+ Some ( Ok ( mut message) ) => return decoders:: decode_histogram_data ( & mut message) ,
498
+ Some ( Err ( Error :: ConnectionReset ) ) => continue ,
499
+ Some ( Err ( e) ) => return Err ( e) ,
500
+ None => return Ok ( Vec :: new ( ) ) ,
501
+ }
499
502
}
500
503
}
501
504
@@ -561,86 +564,60 @@ impl<T: TickDecoder<T>> TickSubscription<T> {
561
564
}
562
565
563
566
pub fn next ( & self ) -> Option < T > {
564
- self . clear_error ( ) ;
565
-
566
- if let Some ( message) = self . next_buffered ( ) {
567
- return Some ( message) ;
568
- }
569
-
570
- if self . done . load ( Ordering :: Relaxed ) {
571
- return None ;
572
- }
573
-
574
- match self . messages . next ( ) {
575
- Some ( Ok ( message) ) if message. message_type ( ) == T :: MESSAGE_TYPE => {
576
- self . fill_buffer ( message) ;
577
- self . next ( )
578
- }
579
- Some ( Ok ( message) ) => {
580
- debug ! ( "unexpected message: {:?}" , message) ;
581
- self . next ( )
582
- }
583
- Some ( Err ( e) ) => {
584
- self . set_error ( e) ;
585
- None
586
- }
587
- None => None ,
588
- }
567
+ self . next_helper ( || self . messages . next ( ) )
589
568
}
590
569
591
570
pub fn try_next ( & self ) -> Option < T > {
592
- self . clear_error ( ) ;
571
+ self . next_helper ( || self . messages . try_next ( ) )
572
+ }
593
573
594
- if let Some ( message ) = self . next_buffered ( ) {
595
- return Some ( message ) ;
596
- }
574
+ pub fn next_timeout ( & self , duration : std :: time :: Duration ) -> Option < T > {
575
+ self . next_helper ( || self . messages . next_timeout ( duration ) )
576
+ }
597
577
598
- if self . done . load ( Ordering :: Relaxed ) {
599
- return None ;
600
- }
578
+ fn next_helper < F > ( & self , next_response : F ) -> Option < T >
579
+ where
580
+ F : Fn ( ) -> Option < Response > ,
581
+ {
582
+ self . clear_error ( ) ;
601
583
602
- match self . messages . try_next ( ) {
603
- Some ( Ok ( message) ) if message. message_type ( ) == T :: MESSAGE_TYPE => {
604
- self . fill_buffer ( message) ;
605
- self . try_next ( )
584
+ loop {
585
+ if let Some ( message) = self . next_buffered ( ) {
586
+ return Some ( message) ;
606
587
}
607
- Some ( Ok ( message ) ) => {
608
- debug ! ( "unexpected message: {:?}" , message ) ;
609
- self . try_next ( )
588
+
589
+ if self . done . load ( Ordering :: Relaxed ) {
590
+ return None ;
610
591
}
611
- Some ( Err ( e) ) => {
612
- self . set_error ( e) ;
613
- None
592
+
593
+ match self . fill_buffer ( next_response ( ) ) {
594
+ Ok ( ( ) ) => continue ,
595
+ Err ( ( ) ) => return None ,
614
596
}
615
- None => None ,
616
597
}
617
598
}
618
599
619
- pub fn next_timeout ( & self , duration : std:: time:: Duration ) -> Option < T > {
620
- self . clear_error ( ) ;
600
+ fn fill_buffer ( & self , response : Option < Response > ) -> Result < ( ) , ( ) > {
601
+ match response {
602
+ Some ( Ok ( mut message) ) if message. message_type ( ) == T :: MESSAGE_TYPE => {
603
+ let mut buffer = self . buffer . lock ( ) . unwrap ( ) ;
621
604
622
- if let Some ( message) = self . next_buffered ( ) {
623
- return Some ( message) ;
624
- }
605
+ let ( ticks, done) = T :: decode ( & mut message) . unwrap ( ) ;
625
606
626
- if self . done . load ( Ordering :: Relaxed ) {
627
- return None ;
628
- }
607
+ buffer. append ( & mut ticks. into ( ) ) ;
608
+ self . done . store ( done, Ordering :: Relaxed ) ;
629
609
630
- match self . messages . next_timeout ( duration) {
631
- Some ( Ok ( message) ) if message. message_type ( ) == T :: MESSAGE_TYPE => {
632
- self . fill_buffer ( message) ;
633
- self . next_timeout ( duration)
610
+ Ok ( ( ) )
634
611
}
635
612
Some ( Ok ( message) ) => {
636
613
debug ! ( "unexpected message: {:?}" , message) ;
637
- self . next_timeout ( duration )
614
+ Ok ( ( ) )
638
615
}
639
616
Some ( Err ( e) ) => {
640
617
self . set_error ( e) ;
641
- None
618
+ Err ( ( ) )
642
619
}
643
- None => None ,
620
+ None => Err ( ( ) ) ,
644
621
}
645
622
}
646
623
@@ -658,15 +635,6 @@ impl<T: TickDecoder<T>> TickSubscription<T> {
658
635
let mut error = self . error . lock ( ) . unwrap ( ) ;
659
636
* error = None ;
660
637
}
661
-
662
- fn fill_buffer ( & self , mut message : ResponseMessage ) {
663
- let mut buffer = self . buffer . lock ( ) . unwrap ( ) ;
664
-
665
- let ( ticks, done) = T :: decode ( & mut message) . unwrap ( ) ;
666
-
667
- buffer. append ( & mut ticks. into ( ) ) ;
668
- self . done . store ( done, Ordering :: Relaxed ) ;
669
- }
670
638
}
671
639
672
640
/// An iterator that yields items as they become available, blocking if necessary.
0 commit comments