ratex_parser/functions/
arrow.rs1use 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}