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,
13 1,
14 Some(vec![ArgType::Size, ArgType::Size, ArgType::Size]),
15 false,
16 true,
17 true,
18 false,
19 false,
20 handle_rule,
21 );
22}
23
24fn handle_rule(
25 ctx: &mut FunctionContext,
26 args: Vec<ParseNode>,
27 opt_args: Vec<Option<ParseNode>>,
28) -> ParseResult<ParseNode> {
29 let shift = opt_args.into_iter().next().flatten().and_then(|n| {
30 if let ParseNode::Size { value, .. } = n {
31 Some(value)
32 } else {
33 None
34 }
35 });
36
37 let mut args = args.into_iter();
38 let width = match args.next() {
39 Some(ParseNode::Size { value, .. }) => value,
40 _ => return Err(ParseError::msg("Expected size for \\rule width")),
41 };
42 let height = match args.next() {
43 Some(ParseNode::Size { value, .. }) => value,
44 _ => return Err(ParseError::msg("Expected size for \\rule height")),
45 };
46
47 Ok(ParseNode::Rule {
48 mode: ctx.parser.mode,
49 shift,
50 width,
51 height,
52 loc: None,
53 })
54}