From c3f755e37a102c47b247fe80e820cd3f8d0296c0 Mon Sep 17 00:00:00 2001 From: ericszentivanyi <247076009+ericszentivanyi@users.noreply.github.com> Date: Sat, 20 Dec 2025 15:37:43 -0500 Subject: [PATCH 1/2] feat: decode ref names --- typify-impl/src/util.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/typify-impl/src/util.rs b/typify-impl/src/util.rs index 848ea5b6..c16cdaf2 100644 --- a/typify-impl/src/util.rs +++ b/typify-impl/src/util.rs @@ -548,7 +548,12 @@ pub(crate) fn ref_key(ref_name: &str) -> RefKey { if ref_name == "#" { RefKey::Root } else if let Some(idx) = ref_name.rfind('/') { - RefKey::Def(ref_name[idx + 1..].to_string()) + let decoded_segment = ref_name[idx + 1..] + .replace("~1", "/") + .replace("~0", "~") + .to_string(); + + RefKey::Def(decoded_segment) } else { panic!("expected a '/' in $ref: {}", ref_name) } From dedd4e9e5248c79e8fad9a72e780f8b8b8962bb0 Mon Sep 17 00:00:00 2001 From: ericszentivanyi <247076009+ericszentivanyi@users.noreply.github.com> Date: Sun, 21 Dec 2025 10:38:19 -0500 Subject: [PATCH 2/2] test: add test for `decode_segment` --- typify-impl/src/util.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/typify-impl/src/util.rs b/typify-impl/src/util.rs index c16cdaf2..64cb813b 100644 --- a/typify-impl/src/util.rs +++ b/typify-impl/src/util.rs @@ -544,14 +544,15 @@ pub(crate) fn constant_string_value(schema: &Schema) -> Option<&str> { } } +fn decode_segment(segment: &str) -> String { + segment.replace("~1", "/").replace("~0", "~") +} + pub(crate) fn ref_key(ref_name: &str) -> RefKey { if ref_name == "#" { RefKey::Root } else if let Some(idx) = ref_name.rfind('/') { - let decoded_segment = ref_name[idx + 1..] - .replace("~1", "/") - .replace("~0", "~") - .to_string(); + let decoded_segment = decode_segment(&ref_name[idx + 1..]); RefKey::Def(decoded_segment) } else { @@ -906,7 +907,7 @@ mod tests { }; use crate::{ - util::{sanitize, schemas_mutually_exclusive, Case}, + util::{decode_segment, sanitize, schemas_mutually_exclusive, Case}, Name, }; @@ -1012,6 +1013,12 @@ mod tests { assert!(schemas_mutually_exclusive(&b, &a, &BTreeMap::new())); } + #[test] + fn test_decode_segment() { + assert_eq!(decode_segment("foo~1bar"), "foo/bar"); + assert_eq!(decode_segment("foo~0bar"), "foo~bar"); + } + #[test] fn test_sanitize() { assert_eq!(sanitize("type", Case::Snake), "type_");