1use std::path::PathBuf;
12
13use appcore_filemaker::{
14 export_bytes, Compiler, DataValue, ExportContext, ExportFormat, ExportRequest, FontAsset,
15 FontManager, LayoutEngine, LayoutOptions, ResourceLimits,
16};
17
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19 let limits = ResourceLimits::default();
20 let compiler = Compiler::builder().limits(limits.clone()).build()?;
21 let template = compiler.compile_template_yaml(include_bytes!("basic.yml"))?;
22 let data: DataValue = serde_json::from_slice(include_bytes!("basic-data.json"))?;
23 let document = compiler.bind(&template, &data, &[])?;
24 let fonts = example_fonts()?;
25 let scene = LayoutEngine::new(&limits, &fonts, LayoutOptions::default())?.resolve(&document)?;
26 let (output, outcome) = export_bytes(
27 &scene,
28 &ExportRequest {
29 format: ExportFormat::Svg,
30 ..ExportRequest::default()
31 },
32 &ExportContext {
33 limits: &limits,
34 fonts: &fonts,
35 assets: None,
36 },
37 )?;
38 let output_path = output_path("basic.svg")?;
39 std::fs::write(&output_path, output)?;
40 println!(
41 "pages={} svg_bytes={} output={}",
42 scene.pages.len(),
43 outcome.bytes_written,
44 output_path.display()
45 );
46 Ok(())
47}
48
49fn example_fonts() -> Result<FontManager, Box<dyn std::error::Error>> {
50 let mut fonts = FontManager::default();
51 fonts.register(FontAsset::new(
52 "NotoSans",
53 include_bytes!("assets/NotoSans-Regular.ttf").to_vec(),
54 0,
55 )?)?;
56 Ok(fonts)
57}
58
59fn output_path(name: &str) -> Result<PathBuf, std::io::Error> {
60 let directory =
61 PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../target/filemaker-examples");
62 std::fs::create_dir_all(&directory)?;
63 Ok(directory.join(name))
64}