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}