@@ -149,13 +149,24 @@ mod sample_rate_as_string {
149
149
where
150
150
D : serde:: Deserializer < ' de > ,
151
151
{
152
- let value = match Option :: < Cow < ' _ , str > > :: deserialize ( deserializer) ? {
152
+ #[ derive( Debug , Clone , Deserialize ) ]
153
+ #[ serde( untagged) ]
154
+ enum StringOrFloat < ' a > {
155
+ String ( #[ serde( borrow) ] Cow < ' a , str > ) ,
156
+ Float ( f64 ) ,
157
+ }
158
+
159
+ let value = match Option :: < StringOrFloat > :: deserialize ( deserializer) ? {
153
160
Some ( value) => value,
154
161
None => return Ok ( None ) ,
155
162
} ;
156
163
157
- let parsed_value =
158
- serde_json:: from_str ( & value) . map_err ( |e| serde:: de:: Error :: custom ( e. to_string ( ) ) ) ?;
164
+ let parsed_value = match value {
165
+ StringOrFloat :: Float ( f) => f,
166
+ StringOrFloat :: String ( s) => {
167
+ serde_json:: from_str ( & s) . map_err ( serde:: de:: Error :: custom) ?
168
+ }
169
+ } ;
159
170
160
171
if parsed_value < 0.0 {
161
172
return Err ( serde:: de:: Error :: custom ( "sample rate cannot be negative" ) ) ;
@@ -387,7 +398,44 @@ mod tests {
387
398
"sample_rate": 0.1
388
399
}
389
400
"# ;
390
- serde_json:: from_str :: < DynamicSamplingContext > ( json) . unwrap_err ( ) ;
401
+ let dsc = serde_json:: from_str :: < DynamicSamplingContext > ( json) . unwrap ( ) ;
402
+ insta:: assert_ron_snapshot!( dsc, @r#"
403
+ {
404
+ "trace_id": "00000000-0000-0000-0000-000000000000",
405
+ "public_key": "abd0f232775f45feab79864e580d160b",
406
+ "release": None,
407
+ "environment": None,
408
+ "transaction": None,
409
+ "sample_rate": "0.1",
410
+ "user_id": "hello",
411
+ "replay_id": None,
412
+ }
413
+ "# ) ;
414
+ }
415
+
416
+ #[ test]
417
+ fn test_parse_sample_rate_integer ( ) {
418
+ let json = r#"
419
+ {
420
+ "trace_id": "00000000-0000-0000-0000-000000000000",
421
+ "public_key": "abd0f232775f45feab79864e580d160b",
422
+ "user_id": "hello",
423
+ "sample_rate": "1"
424
+ }
425
+ "# ;
426
+ let dsc = serde_json:: from_str :: < DynamicSamplingContext > ( json) . unwrap ( ) ;
427
+ insta:: assert_ron_snapshot!( dsc, @r#"
428
+ {
429
+ "trace_id": "00000000-0000-0000-0000-000000000000",
430
+ "public_key": "abd0f232775f45feab79864e580d160b",
431
+ "release": None,
432
+ "environment": None,
433
+ "transaction": None,
434
+ "sample_rate": "1.0",
435
+ "user_id": "hello",
436
+ "replay_id": None,
437
+ }
438
+ "# ) ;
391
439
}
392
440
393
441
#[ test]
0 commit comments