television_previewers/previewers/
env.rs

1use rustc_hash::FxHashMap;
2use std::sync::Arc;
3
4use crate::previewers::{Preview, PreviewContent};
5use television_channels::entry;
6
7#[derive(Debug, Default)]
8pub struct EnvVarPreviewer {
9    cache: FxHashMap<entry::Entry, Arc<Preview>>,
10    _config: EnvVarPreviewerConfig,
11}
12
13#[derive(Debug, Default)]
14pub struct EnvVarPreviewerConfig {}
15
16impl EnvVarPreviewer {
17    pub fn new(config: Option<EnvVarPreviewerConfig>) -> Self {
18        EnvVarPreviewer {
19            cache: FxHashMap::default(),
20            _config: config.unwrap_or_default(),
21        }
22    }
23
24    pub fn preview(&mut self, entry: &entry::Entry) -> Arc<Preview> {
25        // check if we have that preview in the cache
26        if let Some(preview) = self.cache.get(entry) {
27            return preview.clone();
28        }
29        let content = entry.value.as_ref().map(|preview| {
30            maybe_add_newline_after_colon(preview, &entry.name)
31        });
32        let total_lines = content.as_ref().map_or_else(
33            || 1,
34            |c| u16::try_from(c.lines().count()).unwrap_or(u16::MAX),
35        );
36        let preview = Arc::new(Preview {
37            title: entry.name.clone(),
38            content: match content {
39                Some(content) => PreviewContent::PlainTextWrapped(content),
40                None => PreviewContent::Empty,
41            },
42            icon: entry.icon,
43            partial_offset: None,
44            total_lines,
45        });
46        self.cache.insert(entry.clone(), preview.clone());
47        preview
48    }
49}
50
51const PATH: &str = "PATH";
52
53fn maybe_add_newline_after_colon(s: &str, name: &str) -> String {
54    if name.contains(PATH) {
55        return s.replace(':', "\n");
56    }
57    s.to_string()
58}