founder 0.11.0

The package provides a font toolbox.
Documentation
mod support;

use std::io::Result;
use std::path::{Path, PathBuf};

use colored::Colorize;
use resvg::tiny_skia::{Paint, Pixmap, Rect, Transform};
use resvg::usvg::Tree;

fn main() {
    let arguments = arguments::parse(std::env::args()).unwrap();
    let path: PathBuf = arguments
        .get::<String>("path")
        .unwrap_or_else(|| ".".to_string())
        .into();
    let excludes = arguments.get_all::<String>("exclude").unwrap_or_default();
    let excludes = excludes.iter().map(String::as_str).collect::<Vec<_>>();
    support::summarize(
        &folder::scan(
            &path,
            |path| support::filter(path, &[".svg"], &excludes),
            process,
            arguments.get::<u32>("document-size").unwrap_or(28),
            arguments.get::<usize>("workers"),
        )
        .collect::<Vec<_>>(),
    );
}

fn process(path: &Path, document_size: u32) -> Result<Option<()>> {
    match convert(path, document_size) {
        Ok(_) => {
            eprintln!("{} {path:?}", "[success]".green());
            Ok(Some(()))
        }
        Err(error) => {
            eprintln!("{} {path:?} ({error:?})", "[failure]".red());
            Err(error)
        }
    }
}

fn convert(path: &Path, document_size: u32) -> Result<()> {
    macro_rules! raise(
        () => (return Err(std::io::Error::new(
            std::io::ErrorKind::Other,
            "failed to convert to png",
        )))
    );

    let mut canvas = match Pixmap::new(document_size, document_size) {
        Some(value) => value,
        _ => raise!(),
    };
    let content = match Tree::from_data(&std::fs::read(path)?, &Default::default()) {
        Ok(value) => value,
        _ => raise!(),
    };
    let mut paint = Paint::default();
    paint.set_color_rgba8(255, 255, 255, 255);
    canvas.fill_rect(
        Rect::from_xywh(0.0, 0.0, document_size as f32, document_size as f32).unwrap(),
        &paint,
        Transform::identity(),
        None,
    );
    resvg::render(&content, Transform::default(), &mut canvas.as_mut());
    match canvas.save_png(path.with_extension("png")) {
        Ok(_) => Ok(()),
        _ => raise!(),
    }
}