49 lines
1.7 KiB
Rust
49 lines
1.7 KiB
Rust
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<TypstContract, TypstContractError> {
|
|
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<TypstContract, TypstContractError> {
|
|
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"]
|
|
);
|
|
}
|
|
}
|