@@ -188,14 +188,29 @@ struct SpanVisitor<'a> {
188
188
prefix : Option < & ' a str > ,
189
189
}
190
190
191
- impl Visit for SpanVisitor < ' _ > {
192
- fn record_debug ( & mut self , field : & Field , value : & dyn fmt :: Debug ) {
191
+ impl SpanVisitor < ' _ > {
192
+ fn put_span_prefix ( & mut self ) {
193
193
write ! ( self . buf, "S{}" , self . depth) . unwrap ( ) ;
194
194
if let Some ( prefix) = self . prefix {
195
195
self . buf . extend_from_slice ( prefix. as_bytes ( ) ) ;
196
196
}
197
197
self . buf . push ( b'_' ) ;
198
- put_debug ( self . buf , field. name ( ) , value) ;
198
+ }
199
+ }
200
+
201
+ impl Visit for SpanVisitor < ' _ > {
202
+ fn record_str ( & mut self , field : & Field , value : & str ) {
203
+ self . put_span_prefix ( ) ;
204
+ put_field_length_encoded ( self . buf , field. name ( ) , |buf| {
205
+ buf. extend_from_slice ( value. as_bytes ( ) )
206
+ } ) ;
207
+ }
208
+
209
+ fn record_debug ( & mut self , field : & Field , value : & dyn fmt:: Debug ) {
210
+ self . put_span_prefix ( ) ;
211
+ put_field_length_encoded ( self . buf , field. name ( ) , |buf| {
212
+ write ! ( buf, "{:?}" , value) . unwrap ( )
213
+ } ) ;
199
214
}
200
215
}
201
216
@@ -210,23 +225,37 @@ impl<'a> EventVisitor<'a> {
210
225
fn new ( buf : & ' a mut Vec < u8 > , prefix : Option < & ' a str > ) -> Self {
211
226
Self { buf, prefix }
212
227
}
213
- }
214
228
215
- impl Visit for EventVisitor < ' _ > {
216
- fn record_debug ( & mut self , field : & Field , value : & dyn fmt:: Debug ) {
229
+ fn put_prefix ( & mut self , field : & Field ) {
217
230
if let Some ( prefix) = self . prefix {
218
231
if field. name ( ) != "message" {
232
+ // message maps to the standard MESSAGE field so don't prefix it
219
233
self . buf . extend_from_slice ( prefix. as_bytes ( ) ) ;
220
234
self . buf . push ( b'_' ) ;
221
235
}
222
236
}
223
- put_debug ( self . buf , field. name ( ) , value) ;
237
+ }
238
+ }
239
+
240
+ impl Visit for EventVisitor < ' _ > {
241
+ fn record_str ( & mut self , field : & Field , value : & str ) {
242
+ self . put_prefix ( field) ;
243
+ put_field_length_encoded ( self . buf , field. name ( ) , |buf| {
244
+ buf. extend_from_slice ( value. as_bytes ( ) )
245
+ } ) ;
246
+ }
247
+
248
+ fn record_debug ( & mut self , field : & Field , value : & dyn fmt:: Debug ) {
249
+ self . put_prefix ( field) ;
250
+ put_field_length_encoded ( self . buf , field. name ( ) , |buf| {
251
+ write ! ( buf, "{:?}" , value) . unwrap ( )
252
+ } ) ;
224
253
}
225
254
}
226
255
227
256
fn put_metadata ( buf : & mut Vec < u8 > , meta : & Metadata , span : Option < usize > ) {
228
257
if span. is_none ( ) {
229
- put_field (
258
+ put_field_wellformed (
230
259
buf,
231
260
"PRIORITY" ,
232
261
match * meta. level ( ) {
@@ -241,12 +270,12 @@ fn put_metadata(buf: &mut Vec<u8>, meta: &Metadata, span: Option<usize>) {
241
270
if let Some ( n) = span {
242
271
write ! ( buf, "S{}_" , n) . unwrap ( ) ;
243
272
}
244
- put_field ( buf, "TARGET" , meta. target ( ) . as_bytes ( ) ) ;
273
+ put_field_wellformed ( buf, "TARGET" , meta. target ( ) . as_bytes ( ) ) ;
245
274
if let Some ( file) = meta. file ( ) {
246
275
if let Some ( n) = span {
247
276
write ! ( buf, "S{}_" , n) . unwrap ( ) ;
248
277
}
249
- put_field ( buf, "CODE_FILE" , file. as_bytes ( ) ) ;
278
+ put_field_wellformed ( buf, "CODE_FILE" , file. as_bytes ( ) ) ;
250
279
}
251
280
if let Some ( line) = meta. line ( ) {
252
281
if let Some ( n) = span {
@@ -257,12 +286,21 @@ fn put_metadata(buf: &mut Vec<u8>, meta: &Metadata, span: Option<usize>) {
257
286
}
258
287
}
259
288
260
- fn put_debug ( buf : & mut Vec < u8 > , name : & str , value : & dyn fmt:: Debug ) {
289
+ /// Append a sanitized and length-encoded field into `buf`.
290
+ ///
291
+ /// Unlike `put_field_wellformed` this function handles arbitrary field names and values.
292
+ ///
293
+ /// `name` denotes the field name. It gets sanitized before being appended to `buf`.
294
+ ///
295
+ /// `write_value` is invoked with `buf` as argument to append the value data to `buf`. It must
296
+ /// not delete from `buf`, but may append arbitrary data. This function then determines the length
297
+ /// of the data written and adds it in the appropriate place in `buf`.
298
+ fn put_field_length_encoded ( buf : & mut Vec < u8 > , name : & str , write_value : impl FnOnce ( & mut Vec < u8 > ) ) {
261
299
sanitize_name ( name, buf) ;
262
300
buf. push ( b'\n' ) ;
263
301
buf. extend_from_slice ( & [ 0 ; 8 ] ) ; // Length tag, to be populated
264
302
let start = buf. len ( ) ;
265
- write ! ( buf, "{:?}" , value ) . unwrap ( ) ;
303
+ write_value ( buf) ;
266
304
let end = buf. len ( ) ;
267
305
buf[ start - 8 ..start] . copy_from_slice ( & ( ( end - start) as u64 ) . to_le_bytes ( ) ) ;
268
306
buf. push ( b'\n' ) ;
@@ -279,14 +317,23 @@ fn sanitize_name(name: &str, buf: &mut Vec<u8>) {
279
317
) ;
280
318
}
281
319
282
- /// Append arbitrary data with a well-formed name
283
- fn put_field ( buf : & mut Vec < u8 > , name : & str , value : & [ u8 ] ) {
320
+ /// Append arbitrary data with a well-formed name and value.
321
+ ///
322
+ /// `value` must not contain an internal newline, because this function writes
323
+ /// `value` in the new-line separated format.
324
+ ///
325
+ /// For a "newline-safe" variant, see `put_field_length_encoded`.
326
+ fn put_field_wellformed ( buf : & mut Vec < u8 > , name : & str , value : & [ u8 ] ) {
284
327
buf. extend_from_slice ( name. as_bytes ( ) ) ;
285
328
buf. push ( b'\n' ) ;
286
329
put_value ( buf, value) ;
287
330
}
288
331
289
- /// Write the value portion of a key-value pair
332
+ /// Write the value portion of a key-value pair, in newline separated format.
333
+ ///
334
+ /// `value` must not contain an internal newline.
335
+ ///
336
+ /// For a "newline-safe" variant, see `put_field_length_encoded`.
290
337
fn put_value ( buf : & mut Vec < u8 > , value : & [ u8 ] ) {
291
338
buf. extend_from_slice ( & ( value. len ( ) as u64 ) . to_le_bytes ( ) ) ;
292
339
buf. extend_from_slice ( value) ;
0 commit comments