Nest Xilem tuples longer than 10 elements

finchie
Oct 31, 2023, 3:25 PM
RAWT2FQSTIP6EWFQXMAESASEM6AIFCV4PDO6TRUN6EAFVP3526YQC

Dependencies

  • [2] GYTRFADR Support Typst subdirectories
  • [3] FLIMM2YM Return `syn::Expr` instead of `&str` from `transform_inline`
  • [4] 2N3KOCP7 Create MVP Pandoc->Rust compiler
  • [5] BA5Y6VSE Output Rust code using `syn`

Change contents

  • edit in crates/typst_rust_gen/src/lib.rs at line 9
    [2.1162]
    [4.1232]
    const MAX_TUPLE_LEN: usize = 10;
  • edit in crates/typst_rust_gen/src/lib.rs at line 59
    [4.1261][4.1261:1381](),[4.1381][4.1308:1309](),[4.1308][4.1308:1309]()
    let mut args: Punctuated<syn::Expr, syn::token::Comma> = Punctuated::new();
    args.push(self.expression);
  • replacement in crates/typst_rust_gen/src/lib.rs at line 63
    [4.1558][4.1558:1576]()
    args,
    [4.1558]
    [4.1576]
    args: Punctuated::from_iter([self.expression].into_iter()),
  • edit in crates/typst_rust_gen/src/lib.rs at line 369
    [3.280]
    [4.2470]
    dbg!(inline);
  • replacement in crates/typst_rust_gen/src/lib.rs at line 372
    [3.369][3.369:443]()
    pandoc_ast::Inline::Space => syn::Expr::Lit(literal_string(" ")),
    [3.369]
    [4.2579]
    pandoc_ast::Inline::Space | pandoc_ast::Inline::SoftBreak => {
    syn::Expr::Lit(literal_string(" "))
    }
  • edit in crates/typst_rust_gen/src/lib.rs at line 376
    [4.2601]
    [4.2601]
    }
    }
    // Xilem only supports tuples of max length 10, so split up inlines into nested tuples until it fits
    fn split_tuple(expressions: Vec<syn::Expr>) -> Vec<syn::Expr> {
    if expressions.len() <= MAX_TUPLE_LEN {
    return expressions;
    }
    let mut elements: Vec<syn::Expr> = Vec::new();
    for expression_chunk in expressions.chunks(MAX_TUPLE_LEN) {
    let expression_group: Vec<syn::Expr> = expression_chunk.to_vec();
    elements.push(syn::Expr::Tuple(syn::ExprTuple {
    attrs: Vec::new(),
    paren_token: syn::token::Paren::default(),
    elems: Punctuated::from_iter(expression_group.into_iter()),
    }))
    }
    // May need to recursively nest inside tuples
    if elements.len() > MAX_TUPLE_LEN {
    elements = split_tuple(elements);
  • edit in crates/typst_rust_gen/src/lib.rs at line 400
    [4.2607]
    [4.2607]
    elements
  • replacement in crates/typst_rust_gen/src/lib.rs at line 404
    [4.4565][3.444:509]()
    let expressions = inlines.into_iter().map(transform_inline);
    [4.4565]
    [4.4699]
    let expressions = inlines
    .into_iter()
    .map(transform_inline)
    .collect::<Vec<_>>();
  • replacement in crates/typst_rust_gen/src/lib.rs at line 410
    [3.567][3.567:605](),[3.605][4.4899:4926](),[4.4899][4.4899:4926](),[4.4926][3.606:708](),[3.708][4.4963:4970](),[4.4963][4.4963:4970]()
    syn::Expr::Tuple(syn::ExprTuple {
    attrs: Vec::new(),
    paren_token: syn::token::Paren::default(),
    elems: Punctuated::from_iter(expressions),
    })
    [3.567]
    [4.2784]
    let tuples = split_tuple(expressions);
    match &tuples[..] {
    [single] => single.to_owned(),
    _ => syn::Expr::Tuple(syn::ExprTuple {
    attrs: Vec::new(),
    paren_token: syn::token::Paren::default(),
    elems: Punctuated::from_iter(tuples.into_iter()),
    }),
    }