gitprint 0.4.0

Convert git repositories into beautifully formatted, printer-friendly PDFs
Documentation
use printpdf::{ParsedFont, PdfDocument};

use super::layout::FontSet;

const REGULAR: &[u8] = include_bytes!("../../fonts/JetBrainsMono-Regular.ttf");
const BOLD: &[u8] = include_bytes!("../../fonts/JetBrainsMono-Bold.ttf");
const ITALIC: &[u8] = include_bytes!("../../fonts/JetBrainsMono-Italic.ttf");
const BOLD_ITALIC: &[u8] = include_bytes!("../../fonts/JetBrainsMono-BoldItalic.ttf");

fn parse_font(bytes: &[u8], label: &str) -> anyhow::Result<ParsedFont> {
    ParsedFont::from_bytes(bytes, 0, &mut Vec::new())
        .ok_or_else(|| anyhow::anyhow!("font loading failed: {label}: failed to parse font"))
}

pub fn load_fonts(doc: &mut PdfDocument) -> anyhow::Result<FontSet> {
    let regular = parse_font(REGULAR, "regular")?;
    let bold = parse_font(BOLD, "bold")?;
    let italic = parse_font(ITALIC, "italic")?;
    let bold_italic = parse_font(BOLD_ITALIC, "bold-italic")?;

    Ok(FontSet {
        regular: doc.add_font(&regular),
        bold: doc.add_font(&bold),
        italic: doc.add_font(&italic),
        bold_italic: doc.add_font(&bold_italic),
    })
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn load_fonts_succeeds() {
        let mut doc = PdfDocument::new("test");
        assert!(load_fonts(&mut doc).is_ok());
    }

    #[test]
    fn embedded_font_bytes_are_substantial() {
        assert!(REGULAR.len() > 100_000);
        assert!(BOLD.len() > 100_000);
        assert!(ITALIC.len() > 100_000);
        assert!(BOLD_ITALIC.len() > 100_000);
    }
}