use std::ptr;
use encoding_rs::GB18030;
use std::borrow::Cow;
pub fn copy_str_to_i8_array(dst: &mut [i8], src: &str) {
if dst.is_empty() {
return;
}
let bytes = src.as_bytes();
let len = usize::min(bytes.len(), dst.len() - 1);
unsafe {
ptr::copy_nonoverlapping(bytes.as_ptr(), dst.as_mut_ptr() as *mut u8, len);
}
dst[len] = 0;
}
#[macro_export]
macro_rules! print_rsp_info {
($p:expr) => {
if let Some(p) = $p {
println!(
"ErrorID[{}] Message[{}]",
p.ErrorID,
gb18030_cstr_i8_to_str(&p.ErrorMsg).unwrap().to_string()
);
}
};
}
pub fn gb18030_cstr_i8_to_str<'a>(
c_chars: &'a [std::os::raw::c_char],
) -> Result<Cow<'a, str>, String> {
let len = c_chars
.iter()
.position(|&c| c == 0)
.unwrap_or(c_chars.len());
let bytes = &c_chars[..len];
let bytes = unsafe { &*(bytes as *const [std::os::raw::c_char] as *const [u8]) };
if bytes.is_ascii() {
return std::str::from_utf8(bytes)
.map(Cow::Borrowed)
.map_err(|e| format!("Invalid UTF-8: {}", e));
}
let (decoded, _, had_errors) = GB18030.decode(bytes);
if had_errors {
return Err("Failed to decode GB18030 string".to_string());
}
Ok(Cow::Owned(decoded.into_owned()))
}