use core::any::type_name;
use core::fmt::Debug;
use crate::specialization::{AsDebug, AsMethods, AsMethodsMut};
use crate::{InteractiveError, Result};
pub trait Interactive: AsDebug + AsMethods + AsMethodsMut {
fn get_field<'a>(&'a self, field_name: &'a str) -> crate::Result<'a, &dyn crate::Interactive> {
Err(InteractiveError::FieldNotFound {
type_name: type_name::<Self>(),
field_name,
})
}
fn get_field_mut<'a>(
&'a mut self,
field_name: &'a str,
) -> crate::Result<'a, &mut dyn crate::Interactive> {
Err(InteractiveError::FieldNotFound {
type_name: type_name::<Self>(),
field_name,
})
}
fn eval_field(&self, field_name: &str, f: &mut dyn FnMut(Result<'_, &dyn Debug>)) {
f(Err(InteractiveError::FieldNotFound {
type_name: type_name::<Self>(),
field_name,
}))
}
fn get_all_field_names(&self) -> &'static [&'static str] {
&[]
}
}
pub trait Methods {
fn eval_method(
&self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
{
let _ = args;
f(Err(InteractiveError::MethodNotFound {
type_name: type_name::<Self>(),
method_name,
}));
}
}
fn eval_method_mut(
&mut self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
let _ = args;
f(Err(InteractiveError::MethodNotFound {
type_name: type_name::<Self>(),
method_name,
}));
}
fn get_all_method_names(&self) -> &'static [&'static str] {
&[]
}
}
impl<'b, T: 'b + Interactive + ?::core::marker::Sized> Interactive for &'b T
where
&'b T: AsDebug + AsMethods + AsMethodsMut,
{
fn get_field<'a>(&'a self, field_name: &'a str) -> crate::Result<'a, &dyn crate::Interactive> {
T::get_field(self, field_name)
}
fn eval_field(&self, field_name: &str, f: &mut dyn FnMut(Result<'_, &dyn Debug>)) {
T::eval_field(self, field_name, f)
}
fn get_all_field_names(&self) -> &'static [&'static str] {
T::get_all_field_names(self)
}
}
impl<'b, T: 'b + Interactive + ?::core::marker::Sized> Interactive for &'b mut T
where
&'b mut T: AsDebug + AsMethods + AsMethodsMut,
{
fn get_field<'a>(&'a self, field_name: &'a str) -> crate::Result<'a, &dyn crate::Interactive> {
T::get_field(self, field_name)
}
fn get_field_mut<'a>(
&'a mut self,
field_name: &'a str,
) -> crate::Result<'a, &mut dyn crate::Interactive> {
T::get_field_mut(self, field_name)
}
fn eval_field(&self, field_name: &str, f: &mut dyn FnMut(Result<'_, &dyn Debug>)) {
T::eval_field(self, field_name, f)
}
fn get_all_field_names(&self) -> &'static [&'static str] {
T::get_all_field_names(self)
}
}
#[cfg(feature = "std")]
impl<T: Interactive + ?::std::marker::Sized> Interactive for ::std::boxed::Box<T>
where
::std::boxed::Box<T>: AsDebug + AsMethods + AsMethodsMut,
{
fn get_field<'a>(&'a self, field_name: &'a str) -> crate::Result<'a, &dyn crate::Interactive> {
T::get_field(self, field_name)
}
fn get_field_mut<'a>(
&'a mut self,
field_name: &'a str,
) -> crate::Result<'a, &mut dyn crate::Interactive> {
T::get_field_mut(self, field_name)
}
fn eval_field(&self, field_name: &str, f: &mut dyn FnMut(Result<'_, &dyn Debug>)) {
T::eval_field(self, field_name, f)
}
fn get_all_field_names(&self) -> &'static [&'static str] {
T::get_all_field_names(self)
}
}
#[cfg(feature = "std")]
impl<T: Interactive + ?::std::marker::Sized> Interactive for ::std::rc::Rc<T>
where
::std::rc::Rc<T>: AsDebug + AsMethods + AsMethodsMut,
{
fn get_field<'a>(&'a self, field_name: &'a str) -> crate::Result<'a, &dyn crate::Interactive> {
T::get_field(self, field_name)
}
fn eval_field(&self, field_name: &str, f: &mut dyn FnMut(Result<'_, &dyn Debug>)) {
T::eval_field(self, field_name, f)
}
fn get_all_field_names(&self) -> &'static [&'static str] {
T::get_all_field_names(self)
}
}
#[cfg(feature = "std")]
impl<T: Interactive + ?::std::marker::Sized> Interactive for ::std::sync::Arc<T>
where
::std::sync::Arc<T>: AsDebug + AsMethods + AsMethodsMut,
{
fn get_field<'a>(&'a self, field_name: &'a str) -> crate::Result<'a, &dyn crate::Interactive> {
T::get_field(self, field_name)
}
fn eval_field(&self, field_name: &str, f: &mut dyn FnMut(Result<'_, &dyn Debug>)) {
T::eval_field(self, field_name, f)
}
fn get_all_field_names(&self) -> &'static [&'static str] {
T::get_all_field_names(self)
}
}
impl<'a, T: 'a + Methods + ?::core::marker::Sized> Methods for &'a T {
fn eval_method(
&self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
T::eval_method(self, method_name, args, f)
}
fn get_all_method_names(&self) -> &'static [&'static str] {
T::get_all_method_names(self)
}
}
impl<'a, T: 'a + Methods + ?::core::marker::Sized> Methods for &'a mut T {
fn eval_method(
&self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
T::eval_method(self, method_name, args, f)
}
fn eval_method_mut(
&mut self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
T::eval_method_mut(self, method_name, args, f)
}
fn get_all_method_names(&self) -> &'static [&'static str] {
T::get_all_method_names(self)
}
}
#[cfg(feature = "std")]
impl<T: Methods + ?::std::marker::Sized> Methods for ::std::boxed::Box<T> {
fn eval_method(
&self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
T::eval_method(self, method_name, args, f)
}
fn eval_method_mut(
&mut self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
T::eval_method_mut(self, method_name, args, f)
}
fn get_all_method_names(&self) -> &'static [&'static str] {
T::get_all_method_names(self)
}
}
#[cfg(feature = "std")]
impl<T: Methods + ?::std::marker::Sized> Methods for ::std::rc::Rc<T> {
fn eval_method(
&self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
T::eval_method(self, method_name, args, f)
}
fn get_all_method_names(&self) -> &'static [&'static str] {
T::get_all_method_names(self)
}
}
#[cfg(feature = "std")]
impl<T: Methods + ?::std::marker::Sized> Methods for ::std::sync::Arc<T> {
fn eval_method(
&self,
method_name: &str,
args: &str,
f: &mut dyn FnMut(Result<'_, &dyn Debug>),
) {
T::eval_method(self, method_name, args, f)
}
fn get_all_method_names(&self) -> &'static [&'static str] {
T::get_all_method_names(self)
}
}