squiid_engine/
command_mappings.rs

1use std::{borrow::BorrowMut, collections::HashMap};
2
3use crate::{engine::Engine, EngineSignal};
4
5/// Insert a function and reference name into a hashmap
6macro_rules! function_map_entry {
7    ($function_map:expr,$name:expr,$func_name:ident) => {
8        $function_map.insert(
9            String::from($name),
10            Box::new(|engine: &mut Engine| engine.borrow_mut().$func_name()) as Box<EngineFunction>,
11        )
12    };
13}
14
15/// A function within the impl of [`Engine`]
16type EngineFunction = dyn Fn(&mut Engine) -> Result<EngineSignal, String> + Send + Sync + 'static;
17/// A `HashMap` containing commands and `EngineFunction`s for dynamic dispatch
18pub(crate) type CommandsMap = HashMap<String, Box<EngineFunction>>;
19
20/// Create a map of every available function and it's respective command
21pub fn create_function_map() -> CommandsMap {
22    let mut function_map = HashMap::new();
23
24    // Insert string keys and function objects into the hashmap
25
26    function_map_entry!(function_map, "add", add);
27    function_map_entry!(function_map, "subtract", subtract);
28    function_map_entry!(function_map, "divide", divide);
29    function_map_entry!(function_map, "multiply", multiply);
30    function_map_entry!(function_map, "power", power);
31    function_map_entry!(function_map, "sqrt", sqrt);
32    function_map_entry!(function_map, "mod", modulo);
33    function_map_entry!(function_map, "sin", sin);
34    function_map_entry!(function_map, "cos", cos);
35    function_map_entry!(function_map, "tan", tan);
36    function_map_entry!(function_map, "sec", sec);
37    function_map_entry!(function_map, "csc", csc);
38    function_map_entry!(function_map, "cot", cot);
39    function_map_entry!(function_map, "asin", asin);
40    function_map_entry!(function_map, "acos", acos);
41    function_map_entry!(function_map, "atan", atan);
42    function_map_entry!(function_map, "log", log);
43    function_map_entry!(function_map, "blog", blog);
44    function_map_entry!(function_map, "ln", ln);
45    function_map_entry!(function_map, "abs", abs);
46    function_map_entry!(function_map, "eq", equal);
47    function_map_entry!(function_map, "gt", gt);
48    function_map_entry!(function_map, "lt", lt);
49    function_map_entry!(function_map, "leq", geq);
50    function_map_entry!(function_map, "geq", leq);
51    function_map_entry!(function_map, "round", round);
52    function_map_entry!(function_map, "invert", invert);
53    function_map_entry!(function_map, "chs", chs);
54    function_map_entry!(function_map, "drop", drop);
55    function_map_entry!(function_map, "swap", swap);
56    function_map_entry!(function_map, "dup", dup);
57    function_map_entry!(function_map, "rolldown", roll_down);
58    function_map_entry!(function_map, "rollup", roll_up);
59    function_map_entry!(function_map, "store", store);
60    function_map_entry!(function_map, "purge", purge);
61    function_map_entry!(function_map, "invstore", invstore);
62    function_map_entry!(function_map, "clear", clear);
63    function_map_entry!(function_map, "clear", clear);
64    function_map_entry!(function_map, "undo", undo);
65    function_map_entry!(function_map, "redo", redo);
66    function_map_entry!(function_map, "quit", quit);
67
68    // manually insert refresh since it doesn't use an engine method
69    function_map.insert(
70        String::from("refresh"),
71        Box::new(|_engine: &mut Engine| Ok(EngineSignal::StackUpdated)),
72    );
73
74    function_map
75}