mech_core/structures/
enums.rs

1use crate::*;
2
3// Enum -----------------------------------------------------------------------
4
5#[derive(Clone, Debug, PartialEq, Eq)]
6pub struct MechEnum {
7  pub id: u64,
8  pub variants: Vec<(u64, Option<Value>)>,
9  pub names: Ref<Dictionary>,
10}
11
12impl MechEnum {
13
14  pub fn name(&self) -> String {
15    let names_brrw = self.names.borrow();
16    names_brrw.get(&self.id).cloned().unwrap_or_else(|| format!("{}", self.id))
17  }
18
19  #[cfg(feature = "pretty_print")]
20  pub fn to_html(&self) -> String {
21    let mut variants = Vec::new();
22    for (id, value) in &self.variants {
23      let value_html = match value {
24        Some(v) => v.to_html(),
25        None => "None".to_string(),
26      };
27      variants.push(format!("<span class=\"mech-enum-variant\">{}: {}</span>", id, value_html));
28    }
29    format!("<span class=\"mech-enum\"><span class=\"mech-start-brace\">{{</span>{}<span class=\"mech-end-brace\">}}</span></span>", variants.join(", "))
30  }
31
32  pub fn kind(&self) -> ValueKind {
33    ValueKind::Enum(self.id, self.name())
34  }
35
36  pub fn size_of(&self) -> usize {
37    self.variants.iter().map(|(_,v)| v.as_ref().map_or(0, |x| x.size_of())).sum()
38  }
39}
40
41#[cfg(feature = "pretty_print")]
42impl PrettyPrint for MechEnum {
43  fn pretty_print(&self) -> String {
44    println!("Pretty printing enum...");
45    println!("Enum ID: {}", self.id);
46    println!("Variants: {:?}", self.variants);
47    println!("Names: {:?}", self.names.borrow());
48    let mut variants = Vec::new();
49    let dict_brrw = self.names.borrow();
50    let enum_name = dict_brrw.get(&self.id).unwrap();
51    for (id, value) in &self.variants {
52      let value_str = match value {
53        Some(v) => v.pretty_print(),
54        None => "None".to_string(),
55      };
56      let variant_name = dict_brrw.get(id).unwrap();
57      variants.push(format!("{}: {}", variant_name, value_str));
58    }
59    format!("`{} {{ {} }}", enum_name, variants.join(" | "))
60  }
61}
62
63impl Hash for MechEnum {
64  fn hash<H: Hasher>(&self, state: &mut H) {
65    self.id.hash(state);
66    self.variants.hash(state);
67  }
68}
69
70#[derive(Debug, Clone)]
71pub struct UnknownEnumVariantError {
72  pub enum_id: u64,
73  pub given_variant_id: u64,
74}
75impl MechErrorKind2 for UnknownEnumVariantError {
76  fn name(&self) -> &str { "UnknownEnumVariant" }
77  fn message(&self) -> String {
78    format!(
79      "Unknown variant {} for enum {}",
80      self.given_variant_id, self.enum_id
81    )
82  }
83}