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}
10
11impl MechEnum {
12
13  #[cfg(feature = "pretty_print")]
14  pub fn to_html(&self) -> String {
15    let mut variants = Vec::new();
16    for (id, value) in &self.variants {
17      let value_html = match value {
18        Some(v) => v.to_html(),
19        None => "None".to_string(),
20      };
21      variants.push(format!("<span class=\"mech-enum-variant\">{}: {}</span>", id, value_html));
22    }
23    format!("<span class=\"mech-enum\"><span class=\"mech-start-brace\">{{</span>{}<span class=\"mech-end-brace\">}}</span></span>", variants.join(", "))
24  }
25
26  pub fn kind(&self) -> ValueKind {
27    ValueKind::Enum(self.id)
28  }
29
30  pub fn size_of(&self) -> usize {
31    self.variants.iter().map(|(_,v)| v.as_ref().map_or(0, |x| x.size_of())).sum()
32  }
33}
34
35#[cfg(feature = "pretty_print")]
36impl PrettyPrint for MechEnum {
37  fn pretty_print(&self) -> String {
38    let mut builder = Builder::default();
39    let string_elements: Vec<String> = vec![format!("{}{:?}",self.id,self.variants)];
40    builder.push_record(string_elements);
41    let mut table = builder.build();
42    table.with(Style::modern_rounded());
43    format!("{table}")
44  }
45}
46
47impl Hash for MechEnum {
48  fn hash<H: Hasher>(&self, state: &mut H) {
49    self.id.hash(state);
50    self.variants.hash(state);
51  }
52}