#解析器 #变量 #字符串 #引用 #缓存 #hermes #布尔值

hermes_ru

一个非常方便的字符串解析包,可以将字符串中的函数和变量引用解析为相应的值。

1 个不稳定版本

0.1.0 2023年8月24日

#2931Rust 模式

Apache-2.0GPL-3.0-only

17KB
278

Hermes

一个非常方便的字符串解析包,可以将字符串中的函数和变量引用解析为相应的值。

字符串语法示例

let input = "${hostname()}+\"dd\"+true+${name}+${invalid}+${random_str(${len})}+${multiply(1,-2.5,3)}";

字符串可以包含函数调用、变量引用、布尔值、数字和字符串,通过 "+" 连接。

  • 函数表达式:语法是 ${函数名(参数...)},其中函数名是函数的名称,参数是多个参数,也可以没有参数,取决于函数所需的参数。参数也可以是函数调用、变量引用、布尔值、数字和字符串。
  • 变量表达式:语法是 ${变量名}
  • 布尔表达式:只有 truefalse
  • 数字表达式:例如 10-1212.56 等。
  • 字符串 表达式:两个双引号之间的任何字符。例如 "foo and bar"

如何使用

您需要初始化一个 Cache 结构来存储所有变量和函数。然后,您可以调用 parseparse_to_string 函数来解析字符串。

请看以下示例

use hermes::{cache::{ ExpType, Cache, CacheVariable }, error::Error};

fn main() {
    // new a cache with 10 size capacity
    let mut cache = Cache::new(10);
    // add two variables to cache
    cache.add_variable(CacheVariable::new("name".to_string(), ExpType::STRING("liudao".to_string())));
    cache.add_variable(CacheVariable::new("len".to_string(), ExpType::INT(10)));

    // add a custom function to cache
    cache.add_function("multiply", Box::new(|params: Vec<ExpType>| -> Result<ExpType, Error>{
        Ok(params.into_iter().fold(ExpType::FLOAT(1.0f32), |acc, item| {
            let acc_num = if let ExpType::FLOAT(float) = acc {
                float
            } else {
                0.0f32
            };
            match item {
                ExpType::INT(i) => ExpType::FLOAT(acc_num * i as f32),
                ExpType::FLOAT(f) => ExpType::FLOAT(acc_num * f),
                _ => acc,
            }
        }))
        
    }));

    // define a complex str
    let input = "${hostname()}+\"dd\"+true+${name}+${invalid}+${random_str(${len})}+${multiply(1,-2.5,3)}}";
    
    // parse the str
    println!("parse result is: {}", hermes::lexer::parse_to_string(input, &mut cache));

}

输出

parse result is: MacBook-Pro.localddtrueliudaojdTXX8f16d-7.5

内部函数

  • random_str(长度) 获取具有长度的随机字符串。
  • random_bool() 获取一个随机的布尔值。
  • random_num()random_num(end)random_num(start,end) 获取随机数。
  • hostname() 获取主机名。
  • current_time 获取当前时间,带有格式。

依赖项

~5.5–7.5MB
~128K SLoC