@@ -544,14 +544,15 @@ pub(crate) fn constant_string_value(schema: &Schema) -> Option<&str> {
544544 }
545545}
546546
547+ fn decode_segment ( segment : & str ) -> String {
548+ segment. replace ( "~1" , "/" ) . replace ( "~0" , "~" )
549+ }
550+
547551pub ( crate ) fn ref_key ( ref_name : & str ) -> RefKey {
548552 if ref_name == "#" {
549553 RefKey :: Root
550554 } else if let Some ( idx) = ref_name. rfind ( '/' ) {
551- let decoded_segment = ref_name[ idx + 1 ..]
552- . replace ( "~1" , "/" )
553- . replace ( "~0" , "~" )
554- . to_string ( ) ;
555+ let decoded_segment = decode_segment ( & ref_name[ idx + 1 ..] ) ;
555556
556557 RefKey :: Def ( decoded_segment)
557558 } else {
@@ -906,7 +907,7 @@ mod tests {
906907 } ;
907908
908909 use crate :: {
909- util:: { sanitize, schemas_mutually_exclusive, Case } ,
910+ util:: { decode_segment , sanitize, schemas_mutually_exclusive, Case } ,
910911 Name ,
911912 } ;
912913
@@ -1012,6 +1013,12 @@ mod tests {
10121013 assert ! ( schemas_mutually_exclusive( & b, & a, & BTreeMap :: new( ) ) ) ;
10131014 }
10141015
1016+ #[ test]
1017+ fn test_decode_segment ( ) {
1018+ assert_eq ! ( decode_segment( "foo~1bar" ) , "foo/bar" ) ;
1019+ assert_eq ! ( decode_segment( "foo~0bar" ) , "foo~bar" ) ;
1020+ }
1021+
10151022 #[ test]
10161023 fn test_sanitize ( ) {
10171024 assert_eq ! ( sanitize( "type" , Case :: Snake ) , "type_" ) ;
0 commit comments