@@ -52,16 +52,18 @@ use std::io::prelude::*;
52
52
use std:: rc:: Rc ;
53
53
use std:: { fmt, io, mem} ;
54
54
55
- #[ cfg( feature = "unstable-kv" ) ]
56
- use log:: kv;
57
55
use log:: Record ;
58
56
59
57
#[ cfg( feature = "humantime" ) ]
60
58
mod humantime;
59
+ #[ cfg( feature = "unstable-kv" ) ]
60
+ mod kv;
61
61
pub ( crate ) mod writer;
62
62
63
63
#[ cfg( feature = "humantime" ) ]
64
64
pub use self :: humantime:: Timestamp ;
65
+ #[ cfg( feature = "unstable-kv" ) ]
66
+ pub use self :: kv:: * ;
65
67
pub use self :: writer:: glob:: * ;
66
68
67
69
use self :: writer:: { Buffer , Writer } ;
@@ -200,7 +202,7 @@ pub(crate) struct Builder {
200
202
pub custom_format : Option < FormatFn > ,
201
203
pub format_suffix : & ' static str ,
202
204
#[ cfg( feature = "unstable-kv" ) ]
203
- pub key_value_style : KVStyle ,
205
+ pub kv_format : Option < Box < KvFormatFn > > ,
204
206
built : bool ,
205
207
}
206
208
@@ -234,7 +236,7 @@ impl Builder {
234
236
indent : built. format_indent ,
235
237
suffix : built. format_suffix ,
236
238
#[ cfg( feature = "unstable-kv" ) ]
237
- key_value_style : built. key_value_style ,
239
+ kv_format : built. kv_format . as_deref ( ) . unwrap_or ( & default_kv_format ) ,
238
240
buf,
239
241
} ;
240
242
@@ -255,7 +257,7 @@ impl Default for Builder {
255
257
custom_format : None ,
256
258
format_suffix : "\n " ,
257
259
#[ cfg( feature = "unstable-kv" ) ]
258
- key_value_style : KVStyle :: Multiline ,
260
+ kv_format : None ,
259
261
built : false ,
260
262
}
261
263
}
@@ -279,7 +281,7 @@ struct DefaultFormat<'a> {
279
281
buf : & ' a mut Formatter ,
280
282
suffix : & ' a str ,
281
283
#[ cfg( feature = "unstable-kv" ) ]
282
- key_value_style : KVStyle ,
284
+ kv_format : & ' a KvFormatFn ,
283
285
}
284
286
285
287
impl < ' a > DefaultFormat < ' a > {
@@ -454,55 +456,8 @@ impl<'a> DefaultFormat<'a> {
454
456
455
457
#[ cfg( feature = "unstable-kv" ) ]
456
458
fn write_kv ( & mut self , record : & Record ) -> io:: Result < ( ) > {
457
- match self . key_value_style {
458
- KVStyle :: Hidden => Ok ( ( ) ) ,
459
- KVStyle :: Multiline => record
460
- . key_values ( )
461
- . visit ( & mut KVMultilineVisitor ( self ) )
462
- . map_err ( |e| io:: Error :: new ( io:: ErrorKind :: Other , e) ) ,
463
- KVStyle :: Inline => {
464
- let kvs = record. key_values ( ) ;
465
- if kvs. count ( ) > 0 {
466
- write ! ( self . buf, " {}" , self . subtle_style( "{" ) ) ?;
467
-
468
- kvs. visit ( & mut KVInlineVisitor ( self . buf ) )
469
- . map_err ( |e| io:: Error :: new ( io:: ErrorKind :: Other , e) ) ?;
470
- write ! ( self . buf, "{}" , self . subtle_style( " }" ) ) ?;
471
- }
472
- Ok ( ( ) )
473
- }
474
- }
475
- }
476
- }
477
-
478
- #[ cfg( feature = "unstable-kv" ) ]
479
- struct KVInlineVisitor < ' a > ( & ' a mut Formatter ) ;
480
-
481
- #[ cfg( feature = "unstable-kv" ) ]
482
- impl < ' a , ' kvs > kv:: Visitor < ' kvs > for KVInlineVisitor < ' a > {
483
- fn visit_pair ( & mut self , key : kv:: Key < ' kvs > , value : kv:: Value < ' kvs > ) -> Result < ( ) , kv:: Error > {
484
- write ! ( self . 0 , " {}={}" , key, value) . map_err ( |e| e. into ( ) )
485
- }
486
- }
487
-
488
- #[ cfg( feature = "unstable-kv" ) ]
489
- struct KVMultilineVisitor < ' a , ' fmt > ( & ' a mut DefaultFormat < ' fmt > ) ;
490
-
491
- #[ cfg( feature = "unstable-kv" ) ]
492
- impl < ' a , ' kvs , ' fmt > kv:: Visitor < ' kvs > for KVMultilineVisitor < ' a , ' fmt > {
493
- fn visit_pair ( & mut self , key : kv:: Key < ' kvs > , value : kv:: Value < ' kvs > ) -> Result < ( ) , kv:: Error > {
494
- let indent = self . 0 . indent . unwrap_or ( 0 ) ;
495
- write ! (
496
- self . 0 . buf,
497
- // Always use a newline here, because suffix could be something else
498
- // to separate entire records.
499
- "\n {:width$}{}: {}" ,
500
- "" ,
501
- key,
502
- value,
503
- width = indent
504
- ) ?;
505
- Ok ( ( ) )
459
+ let format = self . kv_format ;
460
+ format ( self . buf , record. key_values ( ) )
506
461
}
507
462
}
508
463
@@ -557,7 +512,7 @@ mod tests {
557
512
target : false ,
558
513
level : true ,
559
514
#[ cfg( feature = "unstable-kv" ) ]
560
- key_value_style : KVStyle :: Hidden ,
515
+ kv_format : & hidden_kv_format ,
561
516
written_header_value : false ,
562
517
indent : None ,
563
518
suffix : "\n " ,
@@ -577,7 +532,7 @@ mod tests {
577
532
target : false ,
578
533
level : false ,
579
534
#[ cfg( feature = "unstable-kv" ) ]
580
- key_value_style : KVStyle :: Hidden ,
535
+ kv_format : & hidden_kv_format ,
581
536
written_header_value : false ,
582
537
indent : None ,
583
538
suffix : "\n " ,
@@ -597,7 +552,7 @@ mod tests {
597
552
target : false ,
598
553
level : true ,
599
554
#[ cfg( feature = "unstable-kv" ) ]
600
- key_value_style : KVStyle :: Hidden ,
555
+ kv_format : & hidden_kv_format ,
601
556
written_header_value : false ,
602
557
indent : Some ( 4 ) ,
603
558
suffix : "\n " ,
@@ -617,7 +572,7 @@ mod tests {
617
572
target : false ,
618
573
level : true ,
619
574
#[ cfg( feature = "unstable-kv" ) ]
620
- key_value_style : KVStyle :: Hidden ,
575
+ kv_format : & hidden_kv_format ,
621
576
written_header_value : false ,
622
577
indent : Some ( 0 ) ,
623
578
suffix : "\n " ,
@@ -637,7 +592,7 @@ mod tests {
637
592
target : false ,
638
593
level : false ,
639
594
#[ cfg( feature = "unstable-kv" ) ]
640
- key_value_style : KVStyle :: Hidden ,
595
+ kv_format : & hidden_kv_format ,
641
596
written_header_value : false ,
642
597
indent : Some ( 4 ) ,
643
598
suffix : "\n " ,
@@ -657,7 +612,7 @@ mod tests {
657
612
target : false ,
658
613
level : false ,
659
614
#[ cfg( feature = "unstable-kv" ) ]
660
- key_value_style : KVStyle :: Hidden ,
615
+ kv_format : & hidden_kv_format ,
661
616
written_header_value : false ,
662
617
indent : None ,
663
618
suffix : "\n \n " ,
@@ -677,7 +632,7 @@ mod tests {
677
632
target : false ,
678
633
level : false ,
679
634
#[ cfg( feature = "unstable-kv" ) ]
680
- key_value_style : KVStyle :: Hidden ,
635
+ kv_format : & hidden_kv_format ,
681
636
written_header_value : false ,
682
637
indent : Some ( 4 ) ,
683
638
suffix : "\n \n " ,
@@ -699,7 +654,7 @@ mod tests {
699
654
target : true ,
700
655
level : true ,
701
656
#[ cfg( feature = "unstable-kv" ) ]
702
- key_value_style : KVStyle :: Hidden ,
657
+ kv_format : & hidden_kv_format ,
703
658
written_header_value : false ,
704
659
indent : None ,
705
660
suffix : "\n " ,
@@ -720,7 +675,7 @@ mod tests {
720
675
target : true ,
721
676
level : true ,
722
677
#[ cfg( feature = "unstable-kv" ) ]
723
- key_value_style : KVStyle :: Hidden ,
678
+ kv_format : & hidden_kv_format ,
724
679
written_header_value : false ,
725
680
indent : None ,
726
681
suffix : "\n " ,
@@ -742,7 +697,7 @@ mod tests {
742
697
target : false ,
743
698
level : true ,
744
699
#[ cfg( feature = "unstable-kv" ) ]
745
- key_value_style : KVStyle :: Hidden ,
700
+ kv_format : & hidden_kv_format ,
746
701
written_header_value : false ,
747
702
indent : None ,
748
703
suffix : "\n " ,
@@ -755,7 +710,7 @@ mod tests {
755
710
756
711
#[ cfg( feature = "unstable-kv" ) ]
757
712
#[ test]
758
- fn format_kv_trailer ( ) {
713
+ fn format_kv_default ( ) {
759
714
let kvs = & [ ( "a" , 1u32 ) , ( "b" , 2u32 ) ] [ ..] ;
760
715
let mut f = formatter ( ) ;
761
716
let record = Record :: builder ( )
@@ -772,20 +727,20 @@ mod tests {
772
727
module_path : false ,
773
728
target : false ,
774
729
level : true ,
775
- key_value_style : KVStyle :: Inline ,
730
+ kv_format : & default_kv_format ,
776
731
written_header_value : false ,
777
732
indent : None ,
778
733
suffix : "\n " ,
779
734
buf : & mut f,
780
735
} ,
781
736
) ;
782
737
783
- assert_eq ! ( "[INFO ] log message { a=1 b=2 } \n " , written) ;
738
+ assert_eq ! ( "[INFO ] log message a=1 b=2\n " , written) ;
784
739
}
785
740
786
741
#[ cfg( feature = "unstable-kv" ) ]
787
742
#[ test]
788
- fn format_kv_trailer_full ( ) {
743
+ fn format_kv_default_full ( ) {
789
744
let kvs = & [ ( "a" , 1u32 ) , ( "b" , 2u32 ) ] [ ..] ;
790
745
let mut f = formatter ( ) ;
791
746
let record = Record :: builder ( )
@@ -805,77 +760,14 @@ mod tests {
805
760
module_path : true ,
806
761
target : true ,
807
762
level : true ,
808
- key_value_style : KVStyle :: Inline ,
763
+ kv_format : & default_kv_format ,
809
764
written_header_value : false ,
810
765
indent : None ,
811
766
suffix : "\n " ,
812
767
buf : & mut f,
813
768
} ,
814
769
) ;
815
770
816
- assert_eq ! (
817
- "[INFO test::path target] log\n message { a=1 b=2 }\n " ,
818
- written
819
- ) ;
820
- }
821
-
822
- #[ cfg( feature = "unstable-kv" ) ]
823
- #[ test]
824
- fn format_kv_multiline ( ) {
825
- let kvs = & [ ( "a" , 1u32 ) , ( "b" , 2u32 ) ] [ ..] ;
826
- let mut f = formatter ( ) ;
827
- let record = Record :: builder ( )
828
- . args ( format_args ! ( "log\n message" ) )
829
- . level ( Level :: Info )
830
- . module_path ( Some ( "test::path" ) )
831
- . key_values ( & kvs)
832
- . build ( ) ;
833
-
834
- let written = write_record (
835
- record,
836
- DefaultFormat {
837
- timestamp : None ,
838
- module_path : false ,
839
- target : false ,
840
- level : true ,
841
- key_value_style : KVStyle :: Multiline ,
842
- written_header_value : false ,
843
- indent : None ,
844
- suffix : "\n " ,
845
- buf : & mut f,
846
- } ,
847
- ) ;
848
-
849
- assert_eq ! ( "[INFO ] log\n message\n a: 1\n b: 2\n " , written) ;
850
- }
851
-
852
- #[ cfg( feature = "unstable-kv" ) ]
853
- #[ test]
854
- fn format_kv_multiline_indented ( ) {
855
- let kvs = & [ ( "a" , 1u32 ) , ( "b" , 2u32 ) ] [ ..] ;
856
- let mut f = formatter ( ) ;
857
- let record = Record :: builder ( )
858
- . args ( format_args ! ( "log\n message" ) )
859
- . level ( Level :: Info )
860
- . module_path ( Some ( "test::path" ) )
861
- . key_values ( & kvs)
862
- . build ( ) ;
863
-
864
- let written = write_record (
865
- record,
866
- DefaultFormat {
867
- timestamp : None ,
868
- module_path : false ,
869
- target : false ,
870
- level : true ,
871
- key_value_style : KVStyle :: Multiline ,
872
- written_header_value : false ,
873
- indent : Some ( 2 ) ,
874
- suffix : "\n " ,
875
- buf : & mut f,
876
- } ,
877
- ) ;
878
-
879
- assert_eq ! ( "[INFO ] log\n message\n a: 1\n b: 2\n " , written) ;
771
+ assert_eq ! ( "[INFO test::path target] log\n message a=1 b=2\n " , written) ;
880
772
}
881
773
}
0 commit comments