use crate::{types::Value, Object, VerifiedObject};
use std::{borrow::Borrow, convert::AsRef, ops::Deref};
#[derive(Clone, Debug)]
#[repr(C)]
pub struct AnyObject {
value: Value,
}
impl From<Value> for AnyObject {
fn from(value: Value) -> Self {
AnyObject { value }
}
}
impl Into<Value> for AnyObject {
fn into(self) -> Value {
self.value
}
}
impl Borrow<Value> for AnyObject {
fn borrow(&self) -> &Value {
&self.value
}
}
impl AsRef<Value> for AnyObject {
fn as_ref(&self) -> &Value {
&self.value
}
}
impl AsRef<AnyObject> for AnyObject {
#[inline]
fn as_ref(&self) -> &Self {
self
}
}
impl<T: Object> From<&T> for AnyObject {
fn from(value: &T) -> Self {
value.to_any_object()
}
}
impl Object for AnyObject {
#[inline]
fn value(&self) -> Value {
self.value
}
}
impl Deref for AnyObject {
type Target = Value;
fn deref(&self) -> &Value {
&self.value
}
}
impl VerifiedObject for AnyObject {
fn is_correct_type<T: Object>(_: &T) -> bool {
true
}
fn error_message() -> &'static str {
unreachable!()
}
}
impl PartialEq for AnyObject {
fn eq(&self, other: &Self) -> bool {
self.equals(other)
}
}
#[cfg(test)]
mod tests {
use super::super::super::types::Value;
use crate::{AnyObject, Fixnum, NilClass, Object, RString, VerifiedObject, GC};
use std::borrow::Borrow;
#[test]
fn test_any_object_conversions() {
crate::on_ruby_thread(|| {
let string = RString::new_utf8("any");
let object = string.to_any_object();
GC::start();
assert!(AnyObject::is_correct_type(&object));
assert!(AnyObject::is_correct_type(&NilClass::new()));
let from_ref = AnyObject::from(&string);
assert_eq!(from_ref, object);
let value: Value = object.clone().into();
assert_eq!(AnyObject::from(value), object);
let borrowed: &Value = object.borrow();
assert_eq!(*borrowed, value);
assert_eq!(*AsRef::<Value>::as_ref(&object), value);
assert_eq!(AsRef::<AnyObject>::as_ref(&object), &object);
assert_eq!(*object, value);
assert_ne!(object, Fixnum::new(1).to_any_object());
assert_eq!(object.try_convert_to::<RString>().unwrap().to_str(), "any");
assert!(object.try_convert_to::<Fixnum>().is_err());
});
}
}