@@ -193,6 +193,8 @@ macro_rules! __kv {
193
193
( @{ $( $done: tt) * } $k: ident $( = $v: expr) ? $( , $( $rest: tt) * ) ?) => ( $crate:: __kv!( @{ $( $done) * $k [ ] $( = $v) ?, } $( $( $rest) * ) ?) ) ;
194
194
( @{ $( $done: tt) * } $k: ident : $( = $v: expr) ? $( , $( $rest: tt) * ) ?) => ( $crate:: __kv!( @{ $( $done) * $k [ : ] $( = $v) ?, } $( $( $rest) * ) ?) ) ;
195
195
( @{ $( $done: tt) * } $k: ident : ? $( = $v: expr) ? $( , $( $rest: tt) * ) ?) => ( $crate:: __kv!( @{ $( $done) * $k [ : ?] $( = $v) ?, } $( $( $rest) * ) ?) ) ;
196
+ ( @{ $( $done: tt) * } $k: ident : sval $( = $v: expr) ? $( , $( $rest: tt) * ) ?) => ( $crate:: __kv!( @{ $( $done) * $k [ : sval] $( = $v) ?, } $( $( $rest) * ) ?) ) ;
197
+ ( @{ $( $done: tt) * } $k: ident : serde $( = $v: expr) ? $( , $( $rest: tt) * ) ?) => ( $crate:: __kv!( @{ $( $done) * $k [ : serde] $( = $v) ?, } $( $( $rest) * ) ?) ) ;
196
198
( @{ $( $k: ident [ $( $modifier: tt) * ] $( = $v: expr) ? ) ,+ $( , ) ?} ) => {
197
199
& [ $( ( $crate:: kv:: Key :: __from_static_str( stringify!( $k) ) , $crate:: __kv_value!( $k [ $( $modifier) * ] $( = $v) ?) ) ) ,+]
198
200
} ;
@@ -203,18 +205,28 @@ macro_rules! __kv {
203
205
macro_rules! __kv_value {
204
206
( $k: ident [ $( $modifier: tt) * ] ) => { $crate:: __kv_value!( $k [ $( $modifier) * ] = $k) } ;
205
207
( $k: ident [ ] = $v: expr) => { $crate:: kv:: Value :: from( & $v) } ;
206
- ( $k: ident [ : ] = $v: expr) => { $crate:: kv:: Value :: from_display( & $v) } ;
207
- ( $k: ident [ : ?] = $v: expr) => { $crate:: kv:: Value :: from_debug( & $v) } ;
208
+ ( $k: ident [ : ] = $v: expr) => { $crate:: kv:: Value :: capture_display( & $v) } ;
209
+ ( $k: ident [ : ?] = $v: expr) => { $crate:: kv:: Value :: capture_debug( & $v) } ;
210
+ ( $k: ident [ : sval] = $v: expr) => { $crate:: kv:: Value :: capture_sval2( & $v) } ;
211
+ ( $k: ident [ : serde] = $v: expr) => { $crate:: kv:: Value :: capture_serde1( & $v) } ;
208
212
}
209
213
210
214
#[ cfg( test) ]
211
215
mod tests {
212
216
use std:: {
213
217
fmt:: { self , Debug , Display } ,
214
218
sync:: Arc ,
219
+ vec,
215
220
} ;
216
221
217
- use crate :: { kv:: KeyInner , prelude:: * , test_utils:: * } ;
222
+ use crate :: {
223
+ formatter:: Formatter ,
224
+ kv:: { Key , KeyInner } ,
225
+ prelude:: * ,
226
+ sink:: Sink ,
227
+ test_utils:: { self , * } ,
228
+ ErrorHandler , Record ,
229
+ } ;
218
230
219
231
#[ test]
220
232
fn syntax_and_records ( ) {
@@ -390,4 +402,68 @@ mod tests {
390
402
391
403
assert_eq ! ( check, from_sink) ;
392
404
}
405
+
406
+ #[ test]
407
+ fn kv_types ( ) {
408
+ struct Asserter ;
409
+
410
+ impl Sink for Asserter {
411
+ fn should_log ( & self , _: Level ) -> bool {
412
+ true
413
+ }
414
+ fn flush ( & self ) -> crate :: Result < ( ) > {
415
+ Ok ( ( ) )
416
+ }
417
+ fn level_filter ( & self ) -> LevelFilter {
418
+ LevelFilter :: All
419
+ }
420
+ fn set_level_filter ( & self , _: LevelFilter ) {
421
+ unimplemented ! ( )
422
+ }
423
+ fn set_formatter ( & self , _: Box < dyn Formatter > ) {
424
+ unimplemented ! ( )
425
+ }
426
+ fn set_error_handler ( & self , _: Option < ErrorHandler > ) {
427
+ unimplemented ! ( )
428
+ }
429
+
430
+ fn log ( & self , record : & Record ) -> crate :: Result < ( ) > {
431
+ let kvs = record. key_values ( ) ;
432
+ let value = kvs. get ( Key :: from_str ( "v" ) ) . unwrap ( ) ;
433
+ assert_eq ! ( kvs. len( ) , 1 ) ;
434
+
435
+ match record. payload ( ) {
436
+ "1" => assert ! ( value. to_i64( ) . is_some( ) ) ,
437
+ "2" => assert ! ( value. to_str( ) . is_some( ) ) ,
438
+ "3" => assert ! ( value. to_i64( ) . is_some( ) ) ,
439
+ "4" => assert ! ( value. to_i64( ) . is_some( ) ) ,
440
+ "5" => assert ! ( value. is:: <Vec <i32 >>( ) ) ,
441
+ "6" => assert ! ( value. is:: <Data >( ) ) ,
442
+ "7" => assert ! ( value. is:: <Data >( ) ) ,
443
+ _ => panic ! ( ) ,
444
+ }
445
+ Ok ( ( ) )
446
+ }
447
+ }
448
+
449
+ let asserter = test_utils:: build_test_logger ( |b| b. sink ( Arc :: new ( Asserter ) ) ) ;
450
+
451
+ #[ derive( sval_derive:: Value , serde:: Serialize ) ]
452
+ struct Data {
453
+ i : i32 ,
454
+ v : Vec < i32 > ,
455
+ }
456
+ let data = Data {
457
+ i : 1 ,
458
+ v : vec ! [ 1 , 2 ] ,
459
+ } ;
460
+
461
+ info ! ( logger: asserter, "1" , kv: { v = 1 } ) ;
462
+ info ! ( logger: asserter, "2" , kv: { v = "string" } ) ;
463
+ info ! ( logger: asserter, "3" , kv: { v: = 1 } ) ;
464
+ info ! ( logger: asserter, "4" , kv: { v: ? = 1 } ) ;
465
+ info ! ( logger: asserter, "5" , kv: { v: sval = vec![ 1 , 2 ] } ) ;
466
+ info ! ( logger: asserter, "6" , kv: { v: sval = data } ) ;
467
+ info ! ( logger: asserter, "7" , kv: { v: serde = data } ) ;
468
+ }
393
469
}
0 commit comments