spf 0.9.0

.spf (Simple Pixel Font) file parser
Documentation
#[cfg(test)]
extern crate std;

#[cfg(test)]
mod common;

#[cfg(test)]
mod tests {
    use std::io;

    use super::common;
    use spf::core::*;

    fn init_logger() {
        let _ = env_logger::builder()
            .filter_level(log::LevelFilter::max())
            .is_test(true)
            .try_init();
    }
    fn second_sample_pixmap_table() -> PixmapTable {
        let mut pixmap = Pixmap::default();
        pixmap.custom_width = Some(1);
        pixmap.custom_height = None;
        pixmap.custom_bits_per_pixel = None;
        pixmap.data = vec![0b01000010, 0b01000010, 0b01000010, 0b00001111];

        let mut pixmap_table = PixmapTable::default();
        pixmap_table.configuration_flags = PixmapTableConfigurationFlags::ConstantHeight
            | PixmapTableConfigurationFlags::ConstantBitsPerPixel;
        pixmap_table.constant_width = None;
        pixmap_table.constant_height = Some(4);
        pixmap_table.constant_bits_per_pixel = Some(7);

        pixmap_table.link_flags = PixmapTableLinkFlags::LinkColorTables;
        pixmap_table.color_table_indexes = Some(vec![0]);

        pixmap_table.pixmaps = vec![pixmap];
        pixmap_table
    }

    fn sample_pixmap_table() -> PixmapTable {
        let mut pixmap1 = Pixmap::default();
        pixmap1.custom_width = Some(4);
        pixmap1.data = vec![0b10011111, 0b11111001];

        let mut pixmap2 = Pixmap::default();
        pixmap2.custom_width = Some(5);
        pixmap2.data = vec![0b10110101, 0b11010110, 0b00001111];

        let mut pixmap3 = Pixmap::default();
        pixmap3.custom_width = Some(4);
        pixmap3.data = vec![0b00000110, 0b01101001];

        let mut pixmap4 = Pixmap::default();
        pixmap4.custom_width = Some(4);
        pixmap4.data = vec![0b11110001, 0b10001111];

        let mut pixmap_table = PixmapTable::default();
        pixmap_table.configuration_flags = PixmapTableConfigurationFlags::ConstantHeight
            | PixmapTableConfigurationFlags::ConstantBitsPerPixel;
        pixmap_table.constant_height = Some(4);
        pixmap_table.constant_bits_per_pixel = Some(1);

        pixmap_table.link_flags = PixmapTableLinkFlags::LinkColorTables;
        pixmap_table.color_table_indexes = Some(vec![0]);

        pixmap_table.pixmaps = vec![pixmap1, pixmap2, pixmap3, pixmap4];
        pixmap_table
    }

    fn sample_color_table() -> ColorTable {
        let mut transparent_color = Color::default();
        transparent_color.color_type = None;
        transparent_color.custom_alpha = Some(0);
        transparent_color.red = 0;
        transparent_color.green = 0;
        transparent_color.blue = 0;

        let mut opaque_color = Color::default();
        opaque_color.color_type = None;
        opaque_color.custom_alpha = Some(255);
        opaque_color.red = 36;
        opaque_color.green = 174;
        opaque_color.blue = 214;

        let mut color_table = ColorTable::default();
        color_table.colors = vec![transparent_color, opaque_color];
        color_table
    }

    fn sample_font_table() -> FontTable {
        let mut font = Font::default();
        font.name = "SampleToyFont".into();
        font.author = "The-Nice-One".into();
        font.version = 0;
        font.linked_character_table_indexes = vec![0];

        let mut font_table = FontTable::default();

        font_table.link_flags = FontTableLinkFlags::LinkCharacterTables;
        font_table.character_table_indexes = Some(vec![0]);

        font_table.fonts = vec![font];
        font_table
    }

    fn sample_layout() -> Layout {
        let mut font = Layout::default();

        let mut char1 = Character::default();
        char1.code_points = "o".to_string();

        let mut char2 = Character::default();
        char2.code_points = "w".to_string();

        let mut char3 = Character::default();
        char3.code_points = "😊".to_string();

        let mut char4 = Character::default();
        char4.code_points = "!=".to_string();

        let mut character_table = CharacterTable::default();

        character_table.link_flags = CharacterTableLinkFlags::LinkPixmapTables;
        character_table.pixmap_table_indexes = Some(vec![0]);

        character_table.characters = vec![char1, char2, char3, char4];

        font.character_tables = vec![character_table];
        font.pixmap_tables = vec![sample_pixmap_table(), second_sample_pixmap_table()];
        font.color_tables = vec![sample_color_table()];
        font.font_tables = vec![sample_font_table()];

        font.compact = true;
        font
    }

    #[test]
    fn write_and_read_font_file() -> Result<(), io::Error> {
        init_logger();

        let font = sample_layout();

        common::write_to_file("./res/sampleToyFont.spf", &layout_to_data(&font).unwrap())?;

        let mut buffer: Vec<u8> = vec![];
        common::read_from_file("./res/sampleToyFont.spf", &mut buffer)?;

        let mut standard_engine = DeserializeEngine::from_data(&buffer);
        deserialize_with_engine(&mut standard_engine).unwrap();

        let mut buffer_iter = buffer.iter().copied();
        let reader = byte::ByteReaderIter::from(&mut buffer_iter, buffer.len());
        let mut iterator_engine = DeserializeEngine::from_reader(reader);
        deserialize_with_engine(&mut iterator_engine).unwrap();

        //assert_eq!(standard_engine.layout, iterator_engine.layout);

        Ok(())
    }
}