microcad_lang/value/
value_access.rs1use crate::value::*;
7
8use microcad_lang_base::Identifier;
9
10pub trait ValueAccess {
12 fn by_id(&self, id: &Identifier) -> Option<&Value>;
14
15 fn by_ty(&self, ty: &Type) -> Option<&Value>;
17
18 fn by_str<'a, T>(&'a self, id: &str) -> ValueResult<T>
20 where
21 T: std::convert::TryFrom<&'a Value>,
22 T::Error: std::fmt::Debug,
23 {
24 let id = &Identifier::no_ref(id);
25 if let Some(val) = self.by_id(id) {
26 if let Ok(val) = TryInto::try_into(val) {
27 Ok(val)
28 } else {
29 Err(ValueError::CannotConvert(
30 val.to_string(),
31 std::any::type_name::<T>().into(),
32 ))
33 }
34 } else {
35 Err(ValueError::IdNotFound(id.clone()))
36 }
37 }
38
39 fn get<'a, T>(&'a self, id: &str) -> T
41 where
42 T: std::convert::TryFrom<&'a Value>,
43 T::Error: std::fmt::Debug,
44 {
45 self.by_str(id).expect("No error")
46 }
47
48 fn get_value(&self, id: &str) -> ValueResult<&Value> {
52 let id = Identifier::no_ref(id);
53 if let Some(value) = self.by_id(&id) {
54 Ok(value)
55 } else {
56 Err(ValueError::IdNotFound(id))
57 }
58 }
59
60 fn contains_id(&self, id: &Identifier) -> bool {
62 self.by_id(id).is_some()
63 }
64}