mech_core/structures/
enums.rs1use crate::*;
2
3#[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}