Skip to main content

basic/
basic.rs

1// =============================================================================
2//        #######
3//     ###       ###     F: basic.rs
4//    ##   ## ##   ##    P: AppCore-Runtime
5//         ## ##
6//                       C: 2026/08/30 05:00:00 by dnettoRaw
7//    ##   ## ##   ##    U: 2026/08/30 09:22:55 by dnettoRaw
8//      ###########      S: 1.0.2-rc
9// =============================================================================
10
11use 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}