sys/sysmod/openai/basicfuncs/
math.rs

1//! 計算関連。
2
3use 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
11/// このモジュールの関数をすべて登録する。
12pub fn register_all<T: 'static>(func_table: &mut FunctionTable<T>) {
13    register_calculate(func_table);
14}
15
16/// 数式を計算する。
17async 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}