pub use common::typst_contract::{TypstContract, TypstContractError}; use common::proto::komp_ac::document_data::DocumentTemplateVersion; /// Parses the first meaningful declaration from stored Typst source for the /// admin mapping workflow. It must be the literal `komp_ac_fields` tuple; /// only whitespace and comments may precede it. The server independently runs /// the same shared parser before accepting a submitted mapping. pub fn parse_contract(source: &str) -> Result { common::typst_contract::parse(source) } /// Parses the source carried by an immutable template-version response. Admin /// workflows should retain `version.id` separately and send it back when they /// submit the reviewed table mapping. pub fn parse_template_version( version: &DocumentTemplateVersion, ) -> Result { parse_contract(&version.source_code) } #[cfg(test)] mod tests { use super::{parse_contract, parse_template_version}; use common::proto::komp_ac::document_data::DocumentTemplateVersion; #[test] fn exposes_typst_fields_to_client_workflows() { let contract = parse_contract( r#"#let komp_ac_fields = ("invoice.number", "items[].quantity")"#, ) .unwrap(); assert_eq!( contract.field_paths, ["invoice.number", "items[].quantity"] ); let version = DocumentTemplateVersion { id: 42, source_code: r#"#let komp_ac_fields = ("invoice.number",)"#.to_string(), ..Default::default() }; assert_eq!( parse_template_version(&version).unwrap().field_paths, ["invoice.number"] ); } }