diff options
author | Daniel McCarney <daniel@binaryparadox.net> | 2024-07-05 11:25:46 -0400 |
---|---|---|
committer | Daniel McCarney <daniel@binaryparadox.net> | 2024-09-09 11:42:49 -0400 |
commit | 7edc60029d7c41b3ef5a929ba54f62898f850883 (patch) | |
tree | 8e9b6f845fa9d06885b7dc1eb3fc9267b47e46f4 | |
parent | cc17f0e0b479c466d6a187c84c40fe0999dd22e7 (diff) |
rslice: rustls_str -> str
Offer an `unsafe` route for Rust code to translate a `rustls_str` to
a `&str`.
-rw-r--r-- | src/rslice.rs | 11 | ||||
-rw-r--r-- | tests/rustls_version.rs | 8 |
2 files changed, 12 insertions, 7 deletions
diff --git a/src/rslice.rs b/src/rslice.rs index c14c47e..d653cef 100644 --- a/src/rslice.rs +++ b/src/rslice.rs @@ -212,6 +212,15 @@ impl<'a> rustls_str<'a> { pub unsafe fn into_static(self) -> rustls_str<'static> { std::mem::transmute(self) } + + /// Change a rustls_str back to a &str. + /// + /// # Safety + /// + /// The caller must ensure the rustls_str data is valid utf8 + pub unsafe fn to_str(&self) -> &str { + str::from_utf8_unchecked(slice::from_raw_parts(self.data as *const u8, self.len)) + } } // If the assertion about Rust code being the only creator of rustls_str objects @@ -247,6 +256,8 @@ fn test_rustls_str() { assert_eq!(*rs.data, 'a' as c_char); assert_eq!(*rs.data.offset(3), 'd' as c_char); } + let rs = unsafe { rs.to_str() }; + assert_eq!(rs, s); } #[cfg(test)] diff --git a/tests/rustls_version.rs b/tests/rustls_version.rs index 446cd58..4830d3c 100644 --- a/tests/rustls_version.rs +++ b/tests/rustls_version.rs @@ -1,7 +1,6 @@ use std::fs::File; use std::io::Read; use std::path::PathBuf; -use std::{slice, str}; use toml::Table; @@ -51,12 +50,7 @@ fn rustls_version_match() { // E.g.: // rustls-ffi/0.13.0/rustls/0.23.4 let rustls_ffi_version = rustls_version(); - let rustls_ffi_version = unsafe { - str::from_utf8_unchecked(slice::from_raw_parts( - rustls_ffi_version.data as *const u8, - rustls_ffi_version.len, - )) - }; + let rustls_ffi_version = unsafe { rustls_ffi_version.to_str() }; let rustls_ffi_version_parts = rustls_ffi_version.split('/').collect::<Vec<_>>(); assert_eq!( rustls_ffi_version_parts, |