libsurfer/translation/
enum_translator.rs
1use crate::message::Message;
2use crate::translation::{TranslationPreference, ValueKind, VariableInfo};
3use crate::wave_container::{ScopeId, VarId, VariableMeta};
4use color_eyre::Result;
5use std::borrow::Cow;
6use surfer_translation_types::{TranslationResult, Translator, ValueRepr, VariableValue};
7
8pub struct EnumTranslator {}
9
10impl Translator<VarId, ScopeId, Message> for EnumTranslator {
11 fn name(&self) -> String {
12 "Enum".to_string()
13 }
14
15 fn translate(&self, meta: &VariableMeta, value: &VariableValue) -> Result<TranslationResult> {
16 let str_value = match value {
17 VariableValue::BigUint(v) => Cow::Owned(format!(
18 "{v:0width$b}",
19 width = meta.num_bits.unwrap() as usize
20 )),
21 VariableValue::String(s) => Cow::Borrowed(s),
22 };
23 let (kind, name) = meta
24 .enum_map
25 .get(str_value.as_str())
26 .map(|s| (ValueKind::Normal, s.to_string()))
27 .unwrap_or((ValueKind::Warn, format!("ERROR ({str_value})")));
28 Ok(TranslationResult {
29 val: ValueRepr::String(name),
30 kind,
31 subfields: vec![],
32 })
33 }
34
35 fn variable_info(&self, _variable: &VariableMeta) -> color_eyre::Result<VariableInfo> {
36 Ok(VariableInfo::Bits)
37 }
38
39 fn translates(&self, variable: &VariableMeta) -> Result<TranslationPreference> {
40 if variable.enum_map.is_empty() {
41 Ok(TranslationPreference::No)
42 } else {
43 Ok(TranslationPreference::Prefer)
44 }
45 }
46}