Skip to main content

ratex_parser/functions/
arrow.rs

1use std::collections::HashMap;
2
3use crate::error::ParseResult;
4use crate::functions::{define_function_full, FunctionContext, FunctionSpec};
5use crate::parse_node::ParseNode;
6
7pub fn register(map: &mut HashMap<&'static str, FunctionSpec>) {
8    define_function_full(
9        map,
10        &[
11            "\\xleftarrow",
12            "\\xrightarrow",
13            "\\xLeftarrow",
14            "\\xRightarrow",
15            "\\xleftrightarrow",
16            "\\xLeftrightarrow",
17            "\\xhookleftarrow",
18            "\\xhookrightarrow",
19            "\\xmapsto",
20            "\\xrightharpoondown",
21            "\\xrightharpoonup",
22            "\\xleftharpoondown",
23            "\\xleftharpoonup",
24            "\\xrightleftharpoons",
25            "\\xleftrightharpoons",
26            "\\xlongequal",
27            "\\xtwoheadrightarrow",
28            "\\xtwoheadleftarrow",
29            "\\xtofrom",
30            "\\xrightleftarrows",
31            "\\xrightequilibrium",
32            "\\xleftequilibrium",
33        ],
34        "xArrow",
35        1,
36        1,
37        None,
38        false,
39        false,
40        true,
41        false,
42        false,
43        handle_arrow,
44    );
45}
46
47fn handle_arrow(
48    ctx: &mut FunctionContext,
49    args: Vec<ParseNode>,
50    opt_args: Vec<Option<ParseNode>>,
51) -> ParseResult<ParseNode> {
52    let body = args.into_iter().next().unwrap();
53    let below = opt_args.into_iter().next().flatten();
54
55    Ok(ParseNode::XArrow {
56        mode: ctx.parser.mode,
57        label: ctx.func_name.clone(),
58        body: Box::new(body),
59        below: below.map(Box::new),
60        loc: None,
61    })
62}