webfont-generator 0.7.0

Generate webfonts (SVG, TTF, EOT, WOFF, WOFF2) from SVG icons
Documentation
use std::error::Error;

use crate::input::{finalize_generate_webfonts_options, resolve_generate_webfonts_options};
use crate::pipeline::generate_webfonts_sync;
use crate::test_helpers::{fixture_source_files, webfont_fixture};
use crate::types::{FontType, FormatOptions, GenerateWebfontsOptions, TtfFormatOptions};

use super::{GenerateWebfontsResult, RegenerateError};

pub(super) fn incremental_result() -> GenerateWebfontsResult {
    let mut options = resolve_generate_webfonts_options(GenerateWebfontsOptions {
        css: Some(true),
        dest: "artifacts".to_owned(),
        files: vec![webfont_fixture("add.svg")],
        font_name: Some("result-test".to_owned()),
        format_options: Some(FormatOptions {
            ttf: Some(TtfFormatOptions {
                copyright: None,
                description: None,
                ts: Some(1_700_000_000),
                url: None,
                version: None,
            }),
            ..Default::default()
        }),
        html: Some(true),
        incremental: Some(true),
        ligature: Some(false),
        types: Some(vec![
            FontType::Svg,
            FontType::Ttf,
            FontType::Eot,
            FontType::Woff,
            FontType::Woff2,
        ]),
        write_files: Some(false),
        ..Default::default()
    })
    .unwrap();
    let source_files = fixture_source_files(&options);
    finalize_generate_webfonts_options(&mut options, &source_files).unwrap();
    generate_webfonts_sync(options, source_files).unwrap()
}

#[test]
fn regenerate_error_exposes_recoverable_result_and_source() {
    let error = RegenerateError::new(
        Some(incremental_result()),
        std::io::Error::new(std::io::ErrorKind::InvalidData, "regeneration failed"),
    );

    assert_eq!(error.to_string(), "regeneration failed");
    assert_eq!(error.source().unwrap().to_string(), "regeneration failed");
    assert!(format!("{error:?}").contains("recoverable: true"));

    let (result, source) = error.into_parts();
    assert!(result.is_some());
    assert_eq!(source.kind(), std::io::ErrorKind::InvalidData);
}

#[test]
fn regenerate_error_can_be_unrecoverable() {
    let error = RegenerateError::new(None, std::io::Error::other("task cancelled"));

    assert!(format!("{error:?}").contains("recoverable: false"));
    assert!(error.into_result().is_none());
}