git-plumber 0.1.3

Explore git internals, the plumbing
Documentation
use crate::git::pack::PackIndex;
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};

pub struct HeaderFormatter<'a> {
    pack_index: &'a PackIndex,
}

impl<'a> HeaderFormatter<'a> {
    pub fn new(pack_index: &'a PackIndex) -> Self {
        Self { pack_index }
    }

    pub fn format_header(&self, lines: &mut Vec<Line<'static>>) {
        lines.push(Line::styled(
            "INDEX HEADER",
            Style::default().add_modifier(Modifier::BOLD),
        ));
        lines.push(Line::from("".repeat(20)));
        lines.push(Line::from(""));

        let border_style = Style::default().fg(Color::Gray);
        let left_bit_style = Style::default().fg(Color::LightBlue);
        let right_bit_style = Style::default().fg(Color::LightGreen);

        lines.push(Line::from(vec![
            Span::styled(
                "        Signature",
                Style::default().add_modifier(Modifier::BOLD),
            ),
            Span::from(" (magic number)"),
        ]));
        lines.push(Line::styled(
            "byte│1        2        3        4",
            border_style,
        ));
        lines.push(Line::styled(
            "bit │76543210 76543210 76543210 76543210",
            border_style,
        ));
        lines.push(Line::from(vec![Span::styled(
            "    ├────────┼────────┼────────┼────────┼",
            border_style,
        )]));
        lines.push(Line::from(vec![
            Span::from("bin "),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[0] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[0] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[1] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[1] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[2] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[2] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[3] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[3] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
        ]));
        lines.push(Line::from(vec![
            Span::from("hex "),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[0] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[0] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[1] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[1] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[2] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[2] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[3] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[3] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
        ]));
        lines.push(Line::from(vec![
            Span::from("utf8"),
            Span::styled("", border_style),
            Span::styled("  ╰─", left_bit_style),
            Span::from(format!("{}", self.pack_index.raw_data[0] as char)),
            Span::styled("─╯ ", right_bit_style),
            Span::styled("", border_style),
            Span::styled("  ╰─", left_bit_style),
            Span::from(format!("{}", self.pack_index.raw_data[1] as char)),
            Span::styled("─╯ ", right_bit_style),
            Span::styled("", border_style),
            Span::styled("  ╰─", left_bit_style),
            Span::from(format!("{}", self.pack_index.raw_data[2] as char)),
            Span::styled("─╯ ", right_bit_style),
            Span::styled("", border_style),
            Span::styled("  ╰─", left_bit_style),
            Span::from(format!("{}", self.pack_index.raw_data[3] as char)),
            Span::styled("─╯ ", right_bit_style),
            Span::styled("", border_style),
        ]));
        lines.push(Line::from(vec![Span::styled(
            "    ╰────────┴────────┴────────┴────────┴",
            border_style,
        )]));
        lines.push(Line::from(""));

        lines.push(Line::styled(
            "Version 1 has no signature and starts with  fanout table.",
            Style::default().fg(Color::Gray),
        ));
        lines.push(Line::styled(
            "So signature is something that makes no sense for a table.",
            Style::default().fg(Color::Gray),
        ));
        lines.push(Line::from(""));

        lines.push(Line::from(vec![
            Span::styled(
                "                Version: ",
                Style::default().add_modifier(Modifier::BOLD),
            ),
            Span::from(format!("{}", self.pack_index.version)),
        ]));
        lines.push(Line::styled(
            "byte 5        6        7        8",
            border_style,
        ));
        lines.push(Line::styled(
            "bit  76543210 76543210 76543210 76543210",
            border_style,
        ));
        lines.push(Line::from(vec![Span::styled(
            "    ┼────────┼────────┼────────┼────────┼",
            border_style,
        )]));
        lines.push(Line::from(vec![
            Span::from("bin "),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[4] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[4] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[5] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[5] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[6] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[6] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[7] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("{:04b}", self.pack_index.raw_data[7] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
        ]));
        lines.push(Line::from(vec![
            Span::from("hex "),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[4] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[4] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[5] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01x}", self.pack_index.raw_data[5] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[6] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[6] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[7] >> 4),
                left_bit_style,
            ),
            Span::styled(
                format!("╰─{:01X}", self.pack_index.raw_data[7] & 0x0F),
                right_bit_style,
            ),
            Span::styled("", border_style),
        ]));
        lines.push(Line::from(vec![Span::styled(
            "    ┴────────┴────────┴────────┴────────┴",
            border_style,
        )]));
        lines.push(Line::from(""));
    }
}