simple_expressions/types/
object.rs1use 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}