@@ -188,6 +188,7 @@ fn sanitize_name(name: &str) -> String {
188
188
name
189
189
}
190
190
191
+ #[ derive( Debug ) ]
191
192
struct Source < ' s > {
192
193
shebang : Option < & ' s str > ,
193
194
info : Option < & ' s str > ,
@@ -298,6 +299,32 @@ mod test_expand {
298
299
}
299
300
}
300
301
302
+ #[ track_caller]
303
+ fn assert_err (
304
+ result : Result < impl std:: fmt:: Debug , impl std:: fmt:: Display > ,
305
+ err : impl IntoData ,
306
+ ) {
307
+ match result {
308
+ Ok ( d) => panic ! ( "unexpected Ok({d:#?})" ) ,
309
+ Err ( actual) => snapbox:: assert_data_eq!( actual. to_string( ) , err. raw( ) ) ,
310
+ }
311
+ }
312
+
313
+ #[ test]
314
+ fn split_default ( ) {
315
+ assert_source (
316
+ r#"fn main() {}
317
+ "# ,
318
+ str![ [ r#"
319
+ shebang: None
320
+ info: None
321
+ frontmatter: None
322
+ content: "fn main() {}\n"
323
+
324
+ "# ] ] ,
325
+ ) ;
326
+ }
327
+
301
328
#[ test]
302
329
fn split_dependencies ( ) {
303
330
assert_source (
@@ -317,6 +344,190 @@ content: "fn main() {}\n"
317
344
) ;
318
345
}
319
346
347
+ #[ test]
348
+ fn split_infostring ( ) {
349
+ assert_source (
350
+ r#"---cargo
351
+ [dependencies]
352
+ time="0.1.25"
353
+ ---
354
+ fn main() {}
355
+ "# ,
356
+ str![ [ r#"
357
+ shebang: None
358
+ info: "cargo"
359
+ frontmatter: "[dependencies]\ntime=\"0.1.25\"\n"
360
+ content: "fn main() {}\n"
361
+
362
+ "# ] ] ,
363
+ ) ;
364
+ }
365
+
366
+ #[ test]
367
+ fn split_infostring_whitespace ( ) {
368
+ assert_source (
369
+ r#"--- cargo
370
+ [dependencies]
371
+ time="0.1.25"
372
+ ---
373
+ fn main() {}
374
+ "# ,
375
+ str![ [ r#"
376
+ shebang: None
377
+ info: " cargo"
378
+ frontmatter: "[dependencies]\ntime=\"0.1.25\"\n"
379
+ content: "fn main() {}\n"
380
+
381
+ "# ] ] ,
382
+ ) ;
383
+ }
384
+
385
+ #[ test]
386
+ fn split_shebang ( ) {
387
+ assert_source (
388
+ r#"#!/usr/bin/env cargo
389
+ ---
390
+ [dependencies]
391
+ time="0.1.25"
392
+ ---
393
+ fn main() {}
394
+ "# ,
395
+ str![ [ r##"
396
+ shebang: "#!/usr/bin/env cargo"
397
+ info: None
398
+ frontmatter: "[dependencies]\ntime=\"0.1.25\"\n"
399
+ content: "fn main() {}\n"
400
+
401
+ "## ] ] ,
402
+ ) ;
403
+ }
404
+
405
+ #[ test]
406
+ fn split_crlf ( ) {
407
+ assert_source (
408
+ "#!/usr/bin/env cargo\r \n ---\r \n [dependencies]\r \n time=\" 0.1.25\" \r \n ---\r \n fn main() {}" ,
409
+ str![ [ r##"
410
+ shebang: "#!/usr/bin/env cargo\r"
411
+ info: ""
412
+ frontmatter: "[dependencies]\r\ntime=\"0.1.25\"\r\n"
413
+ content: "fn main() {}"
414
+
415
+ "## ] ]
416
+ ) ;
417
+ }
418
+
419
+ #[ test]
420
+ fn split_leading_newlines ( ) {
421
+ assert_source (
422
+ r#"#!/usr/bin/env cargo
423
+
424
+
425
+
426
+ ---
427
+ [dependencies]
428
+ time="0.1.25"
429
+ ---
430
+
431
+
432
+ fn main() {}
433
+ "# ,
434
+ str![ [ r##"
435
+ shebang: "#!/usr/bin/env cargo"
436
+ info: None
437
+ frontmatter: None
438
+ content: " \n\n\n---\n[dependencies]\ntime=\"0.1.25\"\n---\n\n\nfn main() {}\n"
439
+
440
+ "## ] ] ,
441
+ ) ;
442
+ }
443
+
444
+ #[ test]
445
+ fn split_attribute ( ) {
446
+ assert_source (
447
+ r#"#[allow(dead_code)]
448
+ ---
449
+ [dependencies]
450
+ time="0.1.25"
451
+ ---
452
+ fn main() {}
453
+ "# ,
454
+ str![ [ r##"
455
+ shebang: None
456
+ info: None
457
+ frontmatter: None
458
+ content: "#[allow(dead_code)]\n---\n[dependencies]\ntime=\"0.1.25\"\n---\nfn main() {}\n"
459
+
460
+ "## ] ] ,
461
+ ) ;
462
+ }
463
+
464
+ #[ test]
465
+ fn split_extra_dash ( ) {
466
+ assert_source (
467
+ r#"#!/usr/bin/env cargo
468
+ ----------
469
+ [dependencies]
470
+ time="0.1.25"
471
+ ----------
472
+
473
+ fn main() {}"# ,
474
+ str![ [ r##"
475
+ shebang: "#!/usr/bin/env cargo"
476
+ info: None
477
+ frontmatter: "[dependencies]\ntime=\"0.1.25\"\n"
478
+ content: "\nfn main() {}"
479
+
480
+ "## ] ] ,
481
+ ) ;
482
+ }
483
+
484
+ #[ test]
485
+ fn split_too_few_dashes ( ) {
486
+ assert_err (
487
+ split_source (
488
+ r#"#!/usr/bin/env cargo
489
+ --
490
+ [dependencies]
491
+ time="0.1.25"
492
+ --
493
+ fn main() {}
494
+ "# ,
495
+ ) ,
496
+ str![ "found 2 `-` in rust frontmatter, expected at least 3" ] ,
497
+ ) ;
498
+ }
499
+
500
+ #[ test]
501
+ fn split_mismatched_dashes ( ) {
502
+ assert_err (
503
+ split_source (
504
+ r#"#!/usr/bin/env cargo
505
+ ---
506
+ [dependencies]
507
+ time="0.1.25"
508
+ ----
509
+ fn main() {}
510
+ "# ,
511
+ ) ,
512
+ str![ "unexpected trailing content on closing fence: `-`" ] ,
513
+ ) ;
514
+ }
515
+
516
+ #[ test]
517
+ fn split_missing_close ( ) {
518
+ assert_err (
519
+ split_source (
520
+ r#"#!/usr/bin/env cargo
521
+ ---
522
+ [dependencies]
523
+ time="0.1.25"
524
+ fn main() {}
525
+ "# ,
526
+ ) ,
527
+ str![ "no closing `---` found for frontmatter" ] ,
528
+ ) ;
529
+ }
530
+
320
531
#[ track_caller]
321
532
fn expand ( source : & str ) -> String {
322
533
let shell = crate :: Shell :: from_write ( Box :: new ( Vec :: new ( ) ) ) ;
0 commit comments