use super::*;
pub trait ToSymbol {
fn to_sym(&self, mrb: *mut minu_state) -> RSymbol;
}
impl ToSymbol for &str {
fn to_sym(&self, mrb: *mut minu_state) -> RSymbol {
RSymbol::new(mrb, self)
}
}
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
pub struct RSymbol {
mid: minu_sym,
}
impl RSymbol {
pub fn new(mrb: *mut minu_state, s: &str) -> Self {
unsafe {
let cstr = std::ffi::CString::new(s).unwrap();
let mid = minu_intern_cstr(mrb, cstr.as_ptr());
Self { mid }
}
}
pub fn to_string(&self, mrb: *mut minu_state) -> String {
unsafe {
let p = minu_sym2name(mrb, self.mid);
let cstr = std::ffi::CStr::from_ptr(p);
cstr.to_string_lossy().into_owned()
}
}
pub fn mid(&self) -> minu_sym {
self.mid
}
}
impl TryFromMrb for RSymbol {
fn try_from_mrb(value: MrbValue) -> MrbResult<Self> {
unsafe {
let mid = minu_obj_to_sym(value.mrb, value.val);
Ok(Self { mid })
}
}
}
impl TryIntoMrb for RSymbol {
fn try_into_mrb(self, mrb: *mut minu_state) -> MrbResult<MrbValue> {
unsafe { Ok(MrbValue::new(mrb, minu_symbol_value(self.mid))) }
}
}