simple_expressions/types/
object.rs

1use crate::types::error::Result;
2use crate::types::value::Value;
3use std::any::Any;
4use std::fmt::{Debug, Display, Formatter};
5
6pub trait Object: Any {
7    fn type_name(&self) -> &'static str {
8        "object"
9    }
10    fn get_member(&self, name: &str) -> Result<Value> {
11        Err(crate::types::error::Error::ResolveFailed(name.into()))
12    }
13    fn get_index(&self, index: i64) -> Result<Value> {
14        Err(crate::types::error::Error::NotIndexable(index.to_string()))
15    }
16    fn get_key_value(&self, key: &str) -> Result<Value> {
17        Err(crate::types::error::Error::NotIndexable(key.into()))
18    }
19    fn as_string(&self) -> Option<String> {
20        None
21    }
22    fn as_float(&self) -> Option<f64> {
23        None
24    }
25    fn as_int(&self) -> Option<i64> {
26        None
27    }
28    fn as_bool(&self) -> Option<bool> {
29        None
30    }
31    fn call(&self, _args: &[Value]) -> Result<Value> {
32        Err(crate::types::error::Error::NotCallable)
33    }
34    fn equals(&self, _other: &Value) -> bool {
35        false
36    }
37    fn display(&self) -> String {
38        self.as_string().unwrap_or_else(|| self.type_name().into())
39    }
40    fn debug(&self) -> String {
41        format!("<{}>", self.type_name())
42    }
43
44    fn as_any(&self) -> &dyn Any;
45    fn as_any_mut(&mut self) -> &mut dyn Any;
46}
47
48impl Display for dyn Object {
49    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
50        f.write_str(&self.display())
51    }
52}
53
54impl Debug for dyn Object {
55    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
56        f.write_str(&self.debug())
57    }
58}