use super::*;
impl TryFromMrb for String {
fn try_from_mrb(value: MrbValue) -> MrbResult<Self> {
unsafe {
if minu_string_p(value.val) {
let cstr = std::ffi::CStr::from_ptr(minu_str_to_cstr(value.mrb, value.val));
Ok(cstr.to_string_lossy().into_owned())
} else {
let inspected = minu_inspect(value.mrb, value.val);
let inspected_string = String::try_from_mrb(MrbValue::new(value.mrb, inspected))?;
Err(MrbConversionError {
msg: format!("{} could not converted into String", inspected_string),
})
}
}
}
}
impl TryIntoMrb for String {
fn try_into_mrb(self, mrb: *mut minu_state) -> MrbResult<MrbValue> {
let cstr = std::ffi::CString::new(self).unwrap();
unsafe { Ok(MrbValue::new(mrb, minu_str_new_cstr(mrb, cstr.as_ptr()))) }
}
}
impl TryIntoMrb for &str {
fn try_into_mrb(self, mrb: *mut minu_state) -> MrbResult<MrbValue> {
let cstr = std::ffi::CString::new(self).unwrap();
unsafe { Ok(MrbValue::new(mrb, minu_str_new_cstr(mrb, cstr.as_ptr()))) }
}
}