use std::sync::Arc;
use crate::engine::world::{FontCache, ReportWorld};
use crate::error::{Error, RenderError};
use crate::render::RenderRequest;
pub fn compile_to_pdf(
source: &str,
font_cache: &Arc<FontCache>,
request: &RenderRequest,
) -> crate::Result<Vec<u8>> {
let world = ReportWorld::new(source.to_string(), font_cache.clone());
for (name, path) in &request.assets {
if let Ok(bytes) = std::fs::read(path) {
world.add_file(name, bytes);
}
}
let result = typst::compile(&world);
match result.output {
Ok(document) => {
let standards =
typst_pdf::PdfStandards::new(&[typst_pdf::PdfStandard::Ua_1]).map_err(|e| {
Error::Render(RenderError::TypstCompilation(e.message().to_string()))
})?;
let options = typst_pdf::PdfOptions {
standards,
..Default::default()
};
let pdf_result = typst_pdf::pdf(&document, &options);
match pdf_result {
Ok(pdf_bytes) => Ok(pdf_bytes),
Err(errors) => {
let error_messages: Vec<String> =
errors.iter().map(|e| format!("{:?}", e)).collect();
Err(Error::Render(RenderError::TypstCompilation(
error_messages.join("\n"),
)))
}
}
}
Err(errors) => {
let error_messages: Vec<String> = errors
.iter()
.map(|e| format!("{:?}: {}", e.span, e.message))
.collect();
Err(Error::Render(RenderError::TypstCompilation(
error_messages.join("\n"),
)))
}
}
}