Skip to main content

libsurfer/
variable_direction.rs

1use crate::wave_container::VariableMeta;
2use egui_remixicon::icons;
3use surfer_translation_types::{VariableDirection, VariableNameInfo};
4
5#[local_impl::local_impl]
6impl VariableDirectionExt for VariableDirection {
7    fn from_wellen_direction(direction: wellen::VarDirection) -> VariableDirection {
8        match direction {
9            wellen::VarDirection::Unknown => VariableDirection::Unknown,
10            wellen::VarDirection::Implicit => VariableDirection::Implicit,
11            wellen::VarDirection::Input => VariableDirection::Input,
12            wellen::VarDirection::Output => VariableDirection::Output,
13            wellen::VarDirection::InOut => VariableDirection::InOut,
14            wellen::VarDirection::Buffer => VariableDirection::Buffer,
15            wellen::VarDirection::Linkage => VariableDirection::Linkage,
16        }
17    }
18
19    fn get_icon(&self) -> Option<&str> {
20        match self {
21            VariableDirection::Unknown => None,
22            VariableDirection::Implicit => None,
23            VariableDirection::Input => Some(icons::CONTRACT_RIGHT_FILL),
24            VariableDirection::Output => Some(icons::EXPAND_RIGHT_FILL),
25            VariableDirection::InOut => Some(icons::ARROW_LEFT_RIGHT_LINE),
26            VariableDirection::Buffer => None,
27            VariableDirection::Linkage => Some(icons::LINK),
28        }
29    }
30}
31
32#[must_use]
33pub fn get_direction_string(
34    meta: Option<&VariableMeta>,
35    name_info: Option<&VariableNameInfo>,
36) -> Option<String> {
37    meta.as_ref()
38        .and_then(|meta| meta.direction)
39        .map(|direction| {
40            format!(
41                "{} ",
42                // Icon based on direction
43                direction.get_icon().unwrap_or_else(|| {
44                    if meta.as_ref().is_some_and(|meta| meta.is_parameter()) {
45                        // If parameter
46                        icons::MAP_PIN_2_LINE
47                    } else {
48                        // Align other items (can be improved)
49                        // The padding depends on if we will render monospace or not
50                        if name_info.is_some() { "  " } else { "    " }
51                    }
52                })
53            )
54        })
55}