font-reader 0.1.10

Reads fonts in passed directories and return objects of fonts for Figma Font Helper
Documentation
use crate::formats::ttf;
use crate::types::Fonts;

use binary_reader::BinaryReader;
use std::io::{Error, ErrorKind};

pub struct TTC<'a> {
  num_of_fonts: u32,
  reader: &'a mut BinaryReader,
}

impl<'a> TTC<'a> {
  pub fn new(reader: &'a mut BinaryReader) -> Self {
    TTC {
      reader,
      num_of_fonts: 0,
    }
  }

  fn read_header(&mut self) -> Result<u32, Error> {
    let tag = self.reader.read(4).expect("Cannot read TTC file tag");
    let tag_name = String::from_utf8(tag.to_vec()).expect("Cannot parse ttc tag bytes into string");

    if tag_name == "ttcf" {
      let u_major_version = self.reader.read_u16()?;
      let u_minor_version = self.reader.read_u16()?;

      if (u_major_version == 1 || u_major_version == 2) && u_minor_version == 0 {
        let u_num_of_fonts = self.reader.read_u32()?;

        self.num_of_fonts = u_num_of_fonts;

        return Ok(u_num_of_fonts);
      }
    }

    Err(Error::new(ErrorKind::InvalidData, "Not a ttc file"))
  }

  pub fn get_data(mut self) -> Result<Fonts, Error> {
    self.read_header()?;

    let mut fonts: Fonts = vec![];
    let mut last_pos;

    for _ in 0..self.num_of_fonts {
      let font_offset = self.reader.read_u32().unwrap();

      last_pos = self.reader.pos;

      let mut ttf_reader = ttf::TTF::new(self.reader, font_offset as usize);
      let mut font = ttf_reader.get_data()?;

      fonts.push(font.remove(0));

      self.reader.jmp(last_pos);
    }

    Ok(fonts)
  }
}