diff --git a/godot-core/src/builtin/string/gstring.rs b/godot-core/src/builtin/string/gstring.rs index eb2be9ab8..6c06115ef 100644 --- a/godot-core/src/builtin/string/gstring.rs +++ b/godot-core/src/builtin/string/gstring.rs @@ -225,6 +225,22 @@ impl From<&str> for GString { } } +impl From<&[char]> for GString { + fn from(chars: &[char]) -> Self { + // SAFETY: A `char` value is by definition a valid Unicode code point. + unsafe { + Self::new_with_string_uninit(|string_ptr| { + let ctor = interface_fn!(string_new_with_utf32_chars_and_len); + ctor( + string_ptr, + chars.as_ptr() as *const sys::char32_t, + chars.len() as i64, + ); + }) + } + } +} + impl From for GString { fn from(value: String) -> Self { value.as_str().into() diff --git a/itest/rust/src/builtin_tests/string/gstring_test.rs b/itest/rust/src/builtin_tests/string/gstring_test.rs index ec0c669f0..003a6e6c8 100644 --- a/itest/rust/src/builtin_tests/string/gstring_test.rs +++ b/itest/rust/src/builtin_tests/string/gstring_test.rs @@ -68,13 +68,16 @@ fn string_clone() { fn string_chars() { // Empty tests regression from #228: Null pointer passed to slice::from_raw_parts(). let string = GString::new(); - assert_eq!(string.chars(), &[]); + let empty_char_slice: &[char] = &[]; + assert_eq!(string.chars(), empty_char_slice); + assert_eq!(string, GString::from(empty_char_slice)); let string = String::from("some_string"); let string_chars: Vec = string.chars().collect(); let gstring = GString::from(string); assert_eq!(string_chars, gstring.chars().to_vec()); + assert_eq!(gstring, GString::from(string_chars.as_slice())); } #[itest]