@@ -8,6 +8,7 @@ use std::{
88
99use anyhow:: Context ;
1010use core:: hash:: Hash ;
11+ use regex:: Regex ;
1112use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
1213use serde_yaml:: Value ;
1314
@@ -395,17 +396,26 @@ fn is_default_public_folder(value: &Option<PathBuf>) -> bool {
395396 }
396397}
397398
398- pub fn serialize_pack ( pack : & Pack ) -> String {
399+ pub fn serialize_pack ( pack : & Pack ) -> anyhow :: Result < String > {
399400 let serialized_pack = serde_yaml:: to_string ( & pack) . unwrap ( ) ;
400401 if serialized_pack == "{}\n " {
401- "" . to_owned ( )
402+ Ok ( "" . to_owned ( ) )
402403 } else {
403- serialized_pack
404+ add_back_necessary_quotes ( serialized_pack)
404405 }
405406}
406407
408+ // serde_yaml doesn't add quotes around all constants, which isn't a problem
409+ //unless the constant starts with ::
410+ fn add_back_necessary_quotes (
411+ serialized_pack : String ,
412+ ) -> anyhow:: Result < String > {
413+ let re = Regex :: new ( "- (::.+)" ) ?;
414+ Ok ( re. replace_all ( & serialized_pack, "- \" $1\" " ) . to_string ( ) )
415+ }
416+
407417pub fn write_pack_to_disk ( pack : & Pack ) -> anyhow:: Result < ( ) > {
408- let serialized_pack = serialize_pack ( pack) ;
418+ let serialized_pack = serialize_pack ( pack) ? ;
409419 let pack_dir = pack. yml . parent ( ) . ok_or_else ( || {
410420 anyhow:: Error :: new ( std:: io:: Error :: new (
411421 std:: io:: ErrorKind :: NotFound ,
@@ -469,13 +479,13 @@ mod tests {
469479 use super :: * ;
470480 use pretty_assertions:: assert_eq;
471481
472- fn reserialize_pack ( pack_yml : & str ) -> String {
482+ fn reserialize_pack ( pack_yml : & str ) -> anyhow :: Result < String > {
473483 let deserialized_pack = serde_yaml:: from_str :: < Pack > ( pack_yml) . unwrap ( ) ;
474484 serialize_pack ( & deserialized_pack)
475485 }
476486
477487 #[ test]
478- fn test_serde_sorted_dependencies ( ) {
488+ fn test_serde_sorted_dependencies ( ) -> anyhow :: Result < ( ) > {
479489 let pack_yml = r#"
480490# some comment
481491dependencies:
@@ -484,7 +494,7 @@ dependencies:
484494 - packs/b
485495"# ;
486496
487- let actual = reserialize_pack ( pack_yml) ;
497+ let actual = reserialize_pack ( pack_yml) ? ;
488498
489499 let expected = r#"
490500dependencies:
@@ -494,11 +504,12 @@ dependencies:
494504"#
495505 . trim_start ( ) ;
496506
497- assert_eq ! ( expected, actual)
507+ assert_eq ! ( expected, actual) ;
508+ Ok ( ( ) )
498509 }
499510
500511 #[ test]
501- fn test_serde_with_enforcements ( ) {
512+ fn test_serde_with_enforcements ( ) -> anyhow :: Result < ( ) > {
502513 let pack_yml = r#"
503514# some comment
504515enforce_privacy: true
@@ -510,7 +521,7 @@ dependencies:
510521foobar: true
511522"# ;
512523
513- let actual = reserialize_pack ( pack_yml) ;
524+ let actual = reserialize_pack ( pack_yml) ? ;
514525
515526 let expected = r#"
516527enforce_privacy: true
@@ -523,11 +534,12 @@ foobar: true
523534"#
524535 . trim_start ( ) ;
525536
526- assert_eq ! ( expected, actual)
537+ assert_eq ! ( expected, actual) ;
538+ Ok ( ( ) )
527539 }
528540
529541 #[ test]
530- fn test_serde_with_arbitrary_client_keys ( ) {
542+ fn test_serde_with_arbitrary_client_keys ( ) -> anyhow :: Result < ( ) > {
531543 let pack_yml = r#"
532544# some comment
533545dependencies:
@@ -537,7 +549,7 @@ dependencies:
537549foobar: true
538550"# ;
539551
540- let actual = reserialize_pack ( pack_yml) ;
552+ let actual = reserialize_pack ( pack_yml) ? ;
541553
542554 let expected = r#"
543555dependencies:
@@ -548,11 +560,12 @@ foobar: true
548560"#
549561 . trim_start ( ) ;
550562
551- assert_eq ! ( expected, actual)
563+ assert_eq ! ( expected, actual) ;
564+ Ok ( ( ) )
552565 }
553566
554567 #[ test]
555- fn test_serde_with_duplicate_dependencies ( ) {
568+ fn test_serde_with_duplicate_dependencies ( ) -> anyhow :: Result < ( ) > {
556569 let pack_yml = r#"
557570dependencies:
558571 - packs/a
@@ -562,7 +575,7 @@ dependencies:
562575 - packs/a
563576"# ;
564577
565- let actual = reserialize_pack ( pack_yml) ;
578+ let actual = reserialize_pack ( pack_yml) ? ;
566579
567580 let expected = r#"
568581dependencies:
@@ -571,19 +584,20 @@ dependencies:
571584"#
572585 . trim_start ( ) ;
573586
574- assert_eq ! ( expected, actual)
587+ assert_eq ! ( expected, actual) ;
588+ Ok ( ( ) )
575589 }
576590
577591 #[ test]
578- fn test_serde_with_explicitly_empty_visible ( ) {
592+ fn test_serde_with_explicitly_empty_visible ( ) -> anyhow :: Result < ( ) > {
579593 let pack_yml = r#"
580594visible_to:
581595 - packs/c
582596 - packs/a
583597 - packs/b
584598"# ;
585599
586- let actual = reserialize_pack ( pack_yml) ;
600+ let actual = reserialize_pack ( pack_yml) ? ;
587601
588602 let expected = r#"
589603visible_to:
@@ -593,18 +607,19 @@ visible_to:
593607"#
594608 . trim_start ( ) ;
595609
596- assert_eq ! ( expected, actual)
610+ assert_eq ! ( expected, actual) ;
611+ Ok ( ( ) )
597612 }
598613
599614 #[ test]
600- fn test_serde_with_metadata ( ) {
615+ fn test_serde_with_metadata ( ) -> anyhow :: Result < ( ) > {
601616 let pack_yml = r#"
602617enforce_dependencies: false
603618metadata:
604619 foobar: true
605620"# ;
606621
607- let actual = reserialize_pack ( pack_yml) ;
622+ let actual = reserialize_pack ( pack_yml) ? ;
608623
609624 let expected = r#"
610625enforce_dependencies: false
@@ -613,29 +628,31 @@ metadata:
613628"#
614629 . trim_start ( ) ;
615630
616- assert_eq ! ( expected, actual)
631+ assert_eq ! ( expected, actual) ;
632+ Ok ( ( ) )
617633 }
618634
619635 #[ test]
620- fn test_serde_with_owner ( ) {
636+ fn test_serde_with_owner ( ) -> anyhow :: Result < ( ) > {
621637 let pack_yml = r#"
622638owner: Foobar
623639enforce_dependencies: true
624640"# ;
625641
626- let actual = reserialize_pack ( pack_yml) ;
642+ let actual = reserialize_pack ( pack_yml) ? ;
627643
628644 let expected = r#"
629645owner: Foobar
630646enforce_dependencies: true
631647"#
632648 . trim_start ( ) ;
633649
634- assert_eq ! ( expected, actual)
650+ assert_eq ! ( expected, actual) ;
651+ Ok ( ( ) )
635652 }
636653
637654 #[ test]
638- fn test_serde_with_enforcement_globs ( ) {
655+ fn test_serde_with_enforcement_globs ( ) -> anyhow :: Result < ( ) > {
639656 let pack_yml = r#"
640657enforcement_globs_ignore:
641658 - enforcements:
@@ -682,7 +699,7 @@ enforcement_globs_ignore:
682699 ]
683700 ) ;
684701
685- let reserialized = reserialize_pack ( pack_yml) ;
702+ let reserialized = reserialize_pack ( pack_yml) ? ;
686703 let re_pack: Result < Pack , _ > = serde_yaml:: from_str ( & reserialized) ;
687704 let re_pack = re_pack. unwrap ( ) ;
688705 assert_eq ! ( pack, re_pack) ;
@@ -697,17 +714,19 @@ enforcement_globs_ignore:
697714 } )
698715 ) ;
699716 assert_eq ! ( pack. ignores_for_enforcement( "nope" ) , None ) ;
717+ Ok ( ( ) )
700718 }
701719
702720 #[ test]
703- fn test_serde_with_empty_pack ( ) {
721+ fn test_serde_with_empty_pack ( ) -> anyhow :: Result < ( ) > {
704722 let pack_yml = r#""# ;
705723
706- let actual = reserialize_pack ( pack_yml) ;
724+ let actual = reserialize_pack ( pack_yml) ? ;
707725
708726 let expected = r#""# . trim_start ( ) ;
709727
710- assert_eq ! ( expected, actual)
728+ assert_eq ! ( expected, actual) ;
729+ Ok ( ( ) )
711730 }
712731
713732 #[ test]
@@ -723,6 +742,31 @@ enforcement_globs_ignore:
723742 assert_eq ! ( expected, actual)
724743 }
725744
745+ #[ test]
746+ fn test_serde_with_necessary_quotes_in_ignored_private_constants (
747+ ) -> anyhow:: Result < ( ) > {
748+ let pack_yml = r#"
749+ ignored_private_constants:
750+ - "::Necessary::Quotes::Constant"
751+ - "Unnecessary::Quotes::Constant"
752+ - "::Another::Necessary::Last::Necessary::Constant"
753+ - "::Necessary"
754+ "# ;
755+
756+ let actual = reserialize_pack ( pack_yml) ?;
757+ let expected = r#"
758+ ignored_private_constants:
759+ - "::Another::Necessary::Last::Necessary::Constant"
760+ - "::Necessary"
761+ - "::Necessary::Quotes::Constant"
762+ - Unnecessary::Quotes::Constant
763+ "#
764+ . trim_start ( ) ;
765+
766+ assert_eq ! ( expected, actual) ;
767+ Ok ( ( ) )
768+ }
769+
726770 #[ test]
727771 fn test_all_recorded_violations ( ) -> anyhow:: Result < ( ) > {
728772 let root = test_util:: get_absolute_root (
0 commit comments