ratex_parser/functions/
rule.rs1use std::collections::HashMap;
2
3use crate::error::{ParseError, ParseResult};
4use crate::functions::{define_function_full, ArgType, FunctionContext, FunctionSpec};
5use crate::parse_node::ParseNode;
6
7pub fn register(map: &mut HashMap<&'static str, FunctionSpec>) {
8 define_function_full(
9 map,
10 &["\\rule"],
11 "rule",
12 2, 1,
13 Some(vec![ArgType::Size, ArgType::Size, ArgType::Size]),
14 false,
15 true, true,
16 false, false,
17 handle_rule,
18 );
19}
20
21fn handle_rule(
22 ctx: &mut FunctionContext,
23 args: Vec<ParseNode>,
24 opt_args: Vec<Option<ParseNode>>,
25) -> ParseResult<ParseNode> {
26 let shift = opt_args.into_iter().next().flatten().and_then(|n| {
27 if let ParseNode::Size { value, .. } = n {
28 Some(value)
29 } else {
30 None
31 }
32 });
33
34 let mut args = args.into_iter();
35 let width = match args.next() {
36 Some(ParseNode::Size { value, .. }) => value,
37 _ => return Err(ParseError::msg("Expected size for \\rule width")),
38 };
39 let height = match args.next() {
40 Some(ParseNode::Size { value, .. }) => value,
41 _ => return Err(ParseError::msg("Expected size for \\rule height")),
42 };
43
44 Ok(ParseNode::Rule {
45 mode: ctx.parser.mode,
46 shift,
47 width,
48 height,
49 loc: None,
50 })
51}