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