summaryrefslogtreecommitdiffstats
path: root/src/preview/zero_len_file_view.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/preview/zero_len_file_view.rs')
-rw-r--r--src/preview/zero_len_file_view.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/preview/zero_len_file_view.rs b/src/preview/zero_len_file_view.rs
new file mode 100644
index 0000000..5ec3045
--- /dev/null
+++ b/src/preview/zero_len_file_view.rs
@@ -0,0 +1,56 @@
+use {
+ crate::{
+ display::{CropWriter, SPACE_FILLING, Screen, W},
+ errors::ProgramError,
+ skin::PanelSkin,
+ },
+ char_reader::CharReader,
+ crossterm::{
+ cursor,
+ QueueableCommand,
+ },
+ std::{
+ fs::File,
+ path::PathBuf,
+ },
+ termimad::{Area},
+};
+
+/// a (light) display for a file declaring a size 0,
+/// as happens for many system "files", for example in /proc
+pub struct ZeroLenFileView {
+ path: PathBuf,
+}
+
+impl ZeroLenFileView {
+ pub fn new(path: PathBuf) -> Self {
+ Self {
+ path,
+ }
+ }
+ pub fn display(
+ &mut self,
+ w: &mut W,
+ _screen: Screen,
+ panel_skin: &PanelSkin,
+ area: &Area,
+ ) -> Result<(), ProgramError> {
+ let styles = &panel_skin.styles;
+ let line_count = area.height as usize;
+ let file = File::open(&self.path)?;
+ let mut reader = CharReader::new(file);
+ // line_len here is in chars, and we crop in cols, but it's OK because both
+ // are usually identical for system files and we crop later anyway
+ let line_len = area.width as usize;
+ for y in 0..line_count {
+ w.queue(cursor::MoveTo(area.left, y as u16 + area.top))?;
+ let mut cw = CropWriter::new(w, area.width as usize);
+ let cw = &mut cw;
+ if let Some(line) = reader.next_line(line_len, 15_000)? {
+ cw.queue_str(&styles.default, &line)?;
+ }
+ cw.fill(&styles.default, &SPACE_FILLING)?;
+ }
+ Ok(())
+ }
+}