univert 0.4.0

Universal file converter (library and CLI)
Documentation
use std::fs;

use crate::{Error, Job, Result};

pub fn to_png(job: &Job) -> Result<()> {
  let svg = fs::read(job.input)?;
  let tree = usvg::Tree::from_data(&svg, &usvg::Options::default())
    .map_err(|e| Error::other(format!("svg parse: {e}")))?;
  let size = tree.size().to_int_size();
  let mut pixmap = tiny_skia::Pixmap::new(size.width(), size.height())
    .ok_or_else(|| Error::other("svg: failed to allocate pixmap"))?;
  resvg::render(&tree, tiny_skia::Transform::default(), &mut pixmap.as_mut());
  pixmap
    .save_png(job.output)
    .map_err(|e| Error::other(format!("png write: {e}")))?;
  Ok(())
}

pub fn to_pdf(job: &Job) -> Result<()> {
  let svg = fs::read_to_string(job.input)?;
  let options = svg2pdf::usvg::Options::default();
  let tree = svg2pdf::usvg::Tree::from_str(&svg, &options)
    .map_err(|e| Error::other(format!("svg parse: {e}")))?;
  let conv_opts = svg2pdf::ConversionOptions::default();
  let page_opts = svg2pdf::PageOptions::default();
  let pdf = svg2pdf::to_pdf(&tree, conv_opts, page_opts)
    .map_err(|e| Error::other(format!("svg2pdf: {e}")))?;
  fs::write(job.output, pdf)?;
  Ok(())
}