use core::ffi::c_char;
use core::slice;
use core::str;
use crate::ffi::NSUInteger;
use crate::msg_send;
use crate::rc::AutoreleasePool;
use crate::runtime::NSObject;
#[cfg(not(feature = "gnustep-1-7"))]
pub const UTF8_ENCODING: usize = 4;
#[cfg(feature = "gnustep-1-7")]
pub const UTF8_ENCODING: i32 = 4;
#[inline]
pub unsafe fn nsstring_len(obj: &NSObject) -> NSUInteger {
unsafe { msg_send![obj, lengthOfBytesUsingEncoding: UTF8_ENCODING] }
}
pub unsafe fn nsstring_to_str<'r, 's: 'r, 'p: 'r>(
obj: &'s NSObject,
pool: AutoreleasePool<'p>,
) -> &'r str {
pool.__verify_is_inner();
let bytes: *const c_char = unsafe { msg_send![obj, UTF8String] };
let bytes: *const u8 = bytes.cast();
let len = unsafe { nsstring_len(obj) };
let bytes: &'r [u8] = unsafe { slice::from_raw_parts(bytes, len) };
#[cfg(not(debug_assertions))]
unsafe {
str::from_utf8_unchecked(bytes)
}
#[cfg(debug_assertions)]
{
str::from_utf8(bytes).expect("invalid UTF-8 in NSString")
}
}