use crate::{Error, FmodResultExt, Result};
use fmod_sys::*;
use lanyard::{Utf8CStr, Utf8CString};
pub(crate) fn get_string(
mut string_fn: impl FnMut(&mut [u8]) -> FMOD_RESULT,
) -> Result<Utf8CString> {
let mut buffer = [0; 256];
let mut result = string_fn(&mut buffer);
match result.to_error() {
None => {
let string = Utf8CStr::from_utf8_until_nul(&buffer).unwrap().to_cstring();
return Ok(string);
}
Some(Error::Truncated) => {}
Some(e) => return Err(e),
}
let mut buffer = vec![0u8; 256];
while let FMOD_RESULT::FMOD_ERR_TRUNCATED = result {
buffer.resize(buffer.len() * 2, 0);
result = string_fn(&mut buffer);
}
result.to_result()?;
let string = Utf8CStr::from_utf8_until_nul(&buffer).unwrap().to_cstring();
Ok(string)
}
pub(crate) fn string_from_utf16_le(utf16: &[u16]) -> String {
let iter = utf16.iter().copied().map(u16::from_le);
char::decode_utf16(iter)
.map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
.collect()
}
pub(crate) fn string_from_utf16_be(utf16: &[u16]) -> String {
let iter = utf16.iter().copied().map(u16::from_be);
char::decode_utf16(iter)
.map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
.collect()
}