sys/sysmod/openai/basicfuncs/
math.rs1use crate::sysmod::openai::ParameterType;
4use crate::sysmod::openai::function::{
5 FuncArgs, Function, FunctionTable, ParameterElement, Parameters, get_arg_str,
6};
7use anyhow::Result;
8use std::collections::HashMap;
9use utils::parser;
10
11pub fn register_all<T: 'static>(func_table: &mut FunctionTable<T>) {
13 register_calculate(func_table);
14}
15
16async fn calculate(args: &FuncArgs) -> Result<String> {
18 let formula = get_arg_str(args, "formula")?;
19
20 let toks = parser::lexical_analyze(formula)?;
21 let ast = parser::parse_formula(toks)?;
22 let result = parser::evaluate(ast)?;
23
24 Ok(result.to_string())
25}
26
27fn register_calculate<T: 'static>(func_table: &mut FunctionTable<T>) {
28 let mut properties = HashMap::new();
29 properties.insert(
30 "formula".to_string(),
31 ParameterElement {
32 type_: vec![ParameterType::String],
33 description: Some("Available only ( ) + - * / %".to_string()),
34 ..Default::default()
35 },
36 );
37
38 func_table.register_function(
39 Function {
40 name: "calculate".to_string(),
41 description: Some("Calculate formula.".to_string()),
42 parameters: Parameters {
43 properties,
44 required: vec!["formula".to_string()],
45 ..Default::default()
46 },
47 ..Default::default()
48 },
49 |_, _, args| Box::pin(calculate(args)),
50 );
51}