From 335a430e263be84e5a51746931c16eab5be78566 Mon Sep 17 00:00:00 2001 From: Vojta Toman Date: Fri, 10 Oct 2025 15:36:41 +0200 Subject: [PATCH 1/2] Formatting: Fix support for code points beyond BMP (0000-FFFF) --- src/format.rs | 6 +++--- tests/queries/directive_args.graphql | 2 +- tests/queries/directive_args_multiline.graphql | 2 +- tests/queries/query_var_default_string.graphql | 2 +- tests/queries/string_literal.graphql | 2 +- tests/queries/triple_quoted_literal.graphql | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/format.rs b/src/format.rs index de24163..4ea054a 100644 --- a/src/format.rs +++ b/src/format.rs @@ -129,7 +129,7 @@ impl<'a> Formatter<'a> { for c in s.chars() { match c { '\n' => has_newline = true, - '\r' | '\t' | '\u{0020}'..='\u{FFFF}' => {} + '\r' | '\t' | _ if c >= '\u{0020}' => {} _ => has_nonprintable = true, } } @@ -143,8 +143,8 @@ impl<'a> Formatter<'a> { '\t' => self.write(r"\t"), '"' => self.write("\\\""), '\\' => self.write(r"\\"), - '\u{0020}'..='\u{FFFF}' => self.buf.push(c), - _ => write!(&mut self.buf, "\\u{:04}", c as u32).unwrap(), + '\u{0000}'..='\u{001F}' => write!(&mut self.buf, "\\u{:04}", c as u32).unwrap(), + _ => self.buf.push(c), } } self.buf.push('"'); diff --git a/tests/queries/directive_args.graphql b/tests/queries/directive_args.graphql index 5937cce..700d22f 100644 --- a/tests/queries/directive_args.graphql +++ b/tests/queries/directive_args.graphql @@ -1,3 +1,3 @@ query { - node @dir(a: 1, b: "2", c: true, d: false, e: null) + node @dir(a: 1, b: "2 🤓", c: true, d: false, e: null) } diff --git a/tests/queries/directive_args_multiline.graphql b/tests/queries/directive_args_multiline.graphql index 664028a..2850bb4 100644 --- a/tests/queries/directive_args_multiline.graphql +++ b/tests/queries/directive_args_multiline.graphql @@ -1,7 +1,7 @@ query { node @dir( a: 1, - b: "2", + b: "2 🤓", c: true, d: false, e: null diff --git a/tests/queries/query_var_default_string.graphql b/tests/queries/query_var_default_string.graphql index 64bc387..ea85930 100644 --- a/tests/queries/query_var_default_string.graphql +++ b/tests/queries/query_var_default_string.graphql @@ -1,3 +1,3 @@ -query Foo($site: String = "string") { +query Foo($site: String = "string 🤓") { field } diff --git a/tests/queries/string_literal.graphql b/tests/queries/string_literal.graphql index 160efb4..c71ed6e 100644 --- a/tests/queries/string_literal.graphql +++ b/tests/queries/string_literal.graphql @@ -1,3 +1,3 @@ query { - node(id: "hello") + node(id: "hello 🤓") } diff --git a/tests/queries/triple_quoted_literal.graphql b/tests/queries/triple_quoted_literal.graphql index 1690ef9..a3b8721 100644 --- a/tests/queries/triple_quoted_literal.graphql +++ b/tests/queries/triple_quoted_literal.graphql @@ -1,6 +1,6 @@ query { node(id: """ - Hello, + Hello 🤓, world! """) } From e73ff8c25c3d1c11d6d6d9d5e501edc6b103d680 Mon Sep 17 00:00:00 2001 From: Vojta Toman Date: Wed, 7 Jan 2026 14:05:25 +0100 Subject: [PATCH 2/2] Proper support for Unicode scalar values --- src/format.rs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/format.rs b/src/format.rs index 4ea054a..df13d57 100644 --- a/src/format.rs +++ b/src/format.rs @@ -124,17 +124,7 @@ impl<'a> Formatter<'a> { } pub fn write_quoted(&mut self, s: &str) { - let mut has_newline = false; - let mut has_nonprintable = false; - for c in s.chars() { - match c { - '\n' => has_newline = true, - '\r' | '\t' | _ if c >= '\u{0020}' => {} - _ => has_nonprintable = true, - } - } - if !has_newline || has_nonprintable { - use std::fmt::Write; + if !s.contains('\n') { self.buf.push('"'); for c in s.chars() { match c { @@ -143,7 +133,8 @@ impl<'a> Formatter<'a> { '\t' => self.write(r"\t"), '"' => self.write("\\\""), '\\' => self.write(r"\\"), - '\u{0000}'..='\u{001F}' => write!(&mut self.buf, "\\u{:04}", c as u32).unwrap(), + // This covers all Unicode scalar values (range U+0000..=U+D7FF | U+E000..=U+10FFFF) + // as permitted by Rust's char type and GraphQL's (September 2025 version) SourceCharacter _ => self.buf.push(c), } }