1
1
use crate :: { Error , Result } ;
2
2
#[ cfg( feature = "tls" ) ]
3
3
use native_tls:: { Certificate , Identity , Protocol , TlsConnector , TlsConnectorBuilder } ;
4
- use std:: { collections:: HashMap , str:: FromStr , time:: Duration } ;
4
+ use std:: { collections:: HashMap , fmt :: { self , Display , Write } , str:: FromStr , time:: Duration } ;
5
5
use url:: Url ;
6
6
7
7
const DEFAULT_PORT : u16 = 6379 ;
@@ -423,48 +423,46 @@ impl Config {
423
423
}
424
424
}
425
425
426
- impl ToString for Config {
427
- fn to_string ( & self ) -> String {
426
+ impl Display for Config {
427
+ fn fmt ( & self , f : & mut fmt :: Formatter < ' _ > ) -> fmt :: Result {
428
428
#[ cfg( feature = "tls" ) ]
429
- let mut s = if self . tls_config . is_some ( ) {
429
+ if self . tls_config . is_some ( ) {
430
430
match & self . server {
431
- ServerConfig :: Standalone { host : _, port : _ } => "rediss://" ,
432
- ServerConfig :: Sentinel ( _) => "rediss+sentinel://" ,
433
- ServerConfig :: Cluster ( _) => "rediss+cluster://" ,
431
+ ServerConfig :: Standalone { host : _, port : _ } => f . write_str ( "rediss://" ) ? ,
432
+ ServerConfig :: Sentinel ( _) => f . write_str ( "rediss+sentinel://" ) ? ,
433
+ ServerConfig :: Cluster ( _) => f . write_str ( "rediss+cluster://" ) ? ,
434
434
}
435
435
} else {
436
436
match & self . server {
437
- ServerConfig :: Standalone { host : _, port : _ } => "redis://" ,
438
- ServerConfig :: Sentinel ( _) => "redis+sentinel://" ,
439
- ServerConfig :: Cluster ( _) => "redis+cluster://" ,
437
+ ServerConfig :: Standalone { host : _, port : _ } => f . write_str ( "redis://" ) ? ,
438
+ ServerConfig :: Sentinel ( _) => f . write_str ( "redis+sentinel://" ) ? ,
439
+ ServerConfig :: Cluster ( _) => f . write_str ( "redis+cluster://" ) ? ,
440
440
}
441
441
}
442
- . to_owned ( ) ;
443
442
444
443
#[ cfg( not( feature = "tls" ) ) ]
445
- let mut s = match & self . server {
446
- ServerConfig :: Standalone { host : _, port : _ } => "redis://" ,
447
- ServerConfig :: Sentinel ( _) => "redis+sentinel://" ,
448
- ServerConfig :: Cluster ( _) => "redis+cluster://" ,
444
+ match & self . server {
445
+ ServerConfig :: Standalone { host : _, port : _ } => f . write_str ( "redis://" ) ? ,
446
+ ServerConfig :: Sentinel ( _) => f . write_str ( "redis+sentinel://" ) ? ,
447
+ ServerConfig :: Cluster ( _) => f . write_str ( "redis+cluster://" ) ? ,
449
448
}
450
- . to_owned ( ) ;
451
449
452
450
if let Some ( username) = & self . username {
453
- s . push_str ( username) ;
451
+ f . write_str ( username) ? ;
454
452
}
455
453
456
454
if let Some ( password) = & self . password {
457
- s . push ( ':' ) ;
458
- s . push_str ( password) ;
459
- s . push ( '@' ) ;
455
+ f . write_char ( ':' ) ? ;
456
+ f . write_str ( password) ? ;
457
+ f . write_char ( '@' ) ? ;
460
458
}
461
459
462
460
match & self . server {
463
461
ServerConfig :: Standalone { host, port } => {
464
- s . push_str ( host) ;
462
+ f . write_str ( host) ? ;
465
463
if * port != DEFAULT_PORT {
466
- s . push ( ':' ) ;
467
- s . push_str ( & port. to_string ( ) ) ;
464
+ f . write_char ( ':' ) ? ;
465
+ f . write_str ( & port. to_string ( ) ) ? ;
468
466
}
469
467
}
470
468
ServerConfig :: Sentinel ( SentinelConfig {
@@ -474,30 +472,30 @@ impl ToString for Config {
474
472
password : _,
475
473
username : _,
476
474
} ) => {
477
- s . push_str (
475
+ f . write_str (
478
476
& instances
479
477
. iter ( )
480
478
. map ( |( host, port) | format ! ( "{host}:{port}" ) )
481
479
. collect :: < Vec < String > > ( )
482
480
. join ( "," ) ,
483
- ) ;
484
- s . push ( '/' ) ;
485
- s . push_str ( service_name) ;
481
+ ) ? ;
482
+ f . write_char ( '/' ) ? ;
483
+ f . write_str ( service_name) ? ;
486
484
}
487
485
ServerConfig :: Cluster ( ClusterConfig { nodes } ) => {
488
- s . push_str (
486
+ f . write_str (
489
487
& nodes
490
488
. iter ( )
491
489
. map ( |( host, port) | format ! ( "{host}:{port}" ) )
492
490
. collect :: < Vec < String > > ( )
493
491
. join ( "," ) ,
494
- ) ;
492
+ ) ? ;
495
493
}
496
494
}
497
495
498
496
if self . database > 0 {
499
- s . push ( '/' ) ;
500
- s . push_str ( & self . database . to_string ( ) ) ;
497
+ f . write_char ( '/' ) ? ;
498
+ f . write_str ( & self . database . to_string ( ) ) ? ;
501
499
}
502
500
503
501
// query
@@ -508,82 +506,82 @@ impl ToString for Config {
508
506
if connect_timeout != DEFAULT_CONNECT_TIMEOUT {
509
507
if !query_separator {
510
508
query_separator = true ;
511
- s . push ( '?' ) ;
509
+ f . write_char ( '?' ) ? ;
512
510
} else {
513
- s . push ( '&' ) ;
511
+ f . write_char ( '&' ) ? ;
514
512
}
515
- s . push_str ( & format ! ( "connect_timeout={connect_timeout}" ) ) ;
513
+ f . write_fmt ( format_args ! ( "connect_timeout={connect_timeout}" ) ) ? ;
516
514
}
517
515
518
516
let command_timeout = self . command_timeout . as_millis ( ) as u64 ;
519
517
if command_timeout != DEFAULT_COMMAND_TIMEOUT {
520
518
if !query_separator {
521
519
query_separator = true ;
522
- s . push ( '?' ) ;
520
+ f . write_char ( '?' ) ? ;
523
521
} else {
524
- s . push ( '&' ) ;
522
+ f . write_char ( '&' ) ? ;
525
523
}
526
- s . push_str ( & format ! ( "command_timeout={command_timeout}" ) ) ;
524
+ f . write_fmt ( format_args ! ( "command_timeout={command_timeout}" ) ) ? ;
527
525
}
528
526
529
527
if self . auto_resubscribe != DEFAULT_AUTO_RESUBSCRTBE {
530
528
if !query_separator {
531
529
query_separator = true ;
532
- s . push ( '?' ) ;
530
+ f . write_char ( '?' ) ? ;
533
531
} else {
534
- s . push ( '&' ) ;
532
+ f . write_char ( '&' ) ? ;
535
533
}
536
- s . push_str ( & format ! ( "auto_resubscribe={}" , self . auto_resubscribe) ) ;
534
+ f . write_fmt ( format_args ! ( "auto_resubscribe={}" , self . auto_resubscribe) ) ? ;
537
535
}
538
536
539
537
if self . auto_remonitor != DEFAULT_AUTO_REMONITOR {
540
538
if !query_separator {
541
539
query_separator = true ;
542
- s . push ( '?' ) ;
540
+ f . write_char ( '?' ) ? ;
543
541
} else {
544
- s . push ( '&' ) ;
542
+ f . write_char ( '&' ) ? ;
545
543
}
546
- s . push_str ( & format ! ( "auto_remonitor={}" , self . auto_remonitor) ) ;
544
+ f . write_fmt ( format_args ! ( "auto_remonitor={}" , self . auto_remonitor) ) ? ;
547
545
}
548
546
549
547
if !self . connection_name . is_empty ( ) {
550
548
if !query_separator {
551
549
query_separator = true ;
552
- s . push ( '?' ) ;
550
+ f . write_char ( '?' ) ? ;
553
551
} else {
554
- s . push ( '&' ) ;
552
+ f . write_char ( '&' ) ? ;
555
553
}
556
- s . push_str ( & format ! ( "connection_name={}" , self . connection_name) ) ;
554
+ f . write_fmt ( format_args ! ( "connection_name={}" , self . connection_name) ) ? ;
557
555
}
558
556
559
557
if let Some ( keep_alive) = self . keep_alive {
560
558
if !query_separator {
561
559
query_separator = true ;
562
- s . push ( '?' ) ;
560
+ f . write_char ( '?' ) ? ;
563
561
} else {
564
- s . push ( '&' ) ;
562
+ f . write_char ( '&' ) ? ;
565
563
}
566
- s . push_str ( & format ! ( "keep_alive={}" , keep_alive. as_millis( ) ) ) ;
564
+ f . write_fmt ( format_args ! ( "keep_alive={}" , keep_alive. as_millis( ) ) ) ? ;
567
565
}
568
566
569
567
if self . no_delay != DEFAULT_NO_DELAY {
570
568
if !query_separator {
571
569
query_separator = true ;
572
- s . push ( '?' ) ;
570
+ f . write_char ( '?' ) ? ;
573
571
} else {
574
- s . push ( '&' ) ;
572
+ f . write_char ( '&' ) ? ;
575
573
}
576
- s . push_str ( & format ! ( "no_delay={}" , self . no_delay) ) ;
574
+ f . write_fmt ( format_args ! ( "no_delay={}" , self . no_delay) ) ? ;
577
575
}
578
576
579
577
if self . retry_on_error != DEFAULT_RETRY_ON_ERROR {
580
578
if !query_separator {
581
579
query_separator = true ;
582
- s . push ( '?' ) ;
580
+ f . write_char ( '?' ) ? ;
583
581
} else {
584
- s . push ( '&' ) ;
582
+ f . write_char ( '&' ) ? ;
585
583
}
586
- s . push_str ( & format ! ( "retry_on_error={}" , self . retry_on_error) ) ;
584
+ f . write_fmt ( format_args ! ( "retry_on_error={}" , self . retry_on_error) ) ? ;
587
585
}
588
586
589
587
if let ServerConfig :: Sentinel ( SentinelConfig {
@@ -598,34 +596,34 @@ impl ToString for Config {
598
596
if wait_between_failures != DEFAULT_WAIT_BETWEEN_FAILURES {
599
597
if !query_separator {
600
598
query_separator = true ;
601
- s . push ( '?' ) ;
599
+ f . write_char ( '?' ) ? ;
602
600
} else {
603
- s . push ( '&' ) ;
601
+ f . write_char ( '&' ) ? ;
604
602
}
605
- s . push_str ( & format ! ( "wait_between_failures={wait_between_failures}" ) ) ;
603
+ f . write_fmt ( format_args ! ( "wait_between_failures={wait_between_failures}" ) ) ? ;
606
604
}
607
605
if let Some ( username) = username {
608
606
if !query_separator {
609
607
query_separator = true ;
610
- s . push ( '?' ) ;
608
+ f . write_char ( '?' ) ? ;
611
609
} else {
612
- s . push ( '&' ) ;
610
+ f . write_char ( '&' ) ? ;
613
611
}
614
- s . push_str ( "sentinel_username=" ) ;
615
- s . push_str ( username) ;
612
+ f . write_str ( "sentinel_username=" ) ? ;
613
+ f . write_str ( username) ? ;
616
614
}
617
615
if let Some ( password) = password {
618
616
if !query_separator {
619
- s . push ( '?' ) ;
617
+ f . write_char ( '?' ) ? ;
620
618
} else {
621
- s . push ( '&' ) ;
619
+ f . write_char ( '&' ) ? ;
622
620
}
623
- s . push_str ( "sentinel_password=" ) ;
624
- s . push_str ( password) ;
621
+ f . write_str ( "sentinel_password=" ) ? ;
622
+ f . write_str ( password) ? ;
625
623
}
626
624
}
627
625
628
- s
626
+ Ok ( ( ) )
629
627
}
630
628
}
631
629
@@ -880,7 +878,7 @@ pub enum ReconnectionConfig {
880
878
jitter : u32 ,
881
879
} ,
882
880
/// Backoff reconnection attempts exponentially, multiplying the last delay by `multiplicative_factor` each time.
883
- ///
881
+ ///
884
882
/// see <https://en.wikipedia.org/wiki/Exponential_backoff>
885
883
Exponential {
886
884
/// Maximum number of attemps, set `0` to retry forever.
0 commit comments