use core::any::type_name;
use core::fmt::Debug;
use auto_impl::auto_impl;
use crate::specialization::{AsDebug, AsMethods, AsMethodsMut};
use crate::{InteractiveError, Result};
#[cfg_attr(feature = "std", auto_impl(&, &mut, Box, Rc, Arc))]
#[cfg_attr(not(feature = "std"), auto_impl(&, &mut))]
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,
})
}
#[auto_impl(keep_default_for(&, Rc, Arc))]
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] {
&[]
}
}
#[cfg_attr(feature = "std", auto_impl(&, &mut, Box, Rc, Arc))]
#[cfg_attr(not(feature = "std"), auto_impl(&, &mut))]
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,
}));
}
}
#[auto_impl(keep_default_for(&, Rc, Arc))]
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] {
&[]
}
}