television_previewers/previewers/
env.rs1use 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 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}