Skip to main content

ratex_parser/functions/
rule.rs

1use 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}