1 个不稳定版本
0.1.0 | 2023年8月24日 |
---|
#2931 在 Rust 模式
17KB
278 行
Hermes
一个非常方便的字符串解析包,可以将字符串中的函数和变量引用解析为相应的值。
字符串语法示例
let input = "${hostname()}+\"dd\"+true+${name}+${invalid}+${random_str(${len})}+${multiply(1,-2.5,3)}";
字符串可以包含函数调用、变量引用、布尔值、数字和字符串,通过 "+" 连接。
函数表达式
:语法是${函数名(参数...)}
,其中函数名是函数的名称,参数是多个参数,也可以没有参数,取决于函数所需的参数。参数也可以是函数调用、变量引用、布尔值、数字和字符串。变量表达式
:语法是${变量名}
。布尔表达式
:只有true
或false
。数字表达式
:例如10
、-12
、12.56
等。字符串 表达式
:两个双引号之间的任何字符。例如"foo and bar"
。
如何使用
您需要初始化一个 Cache
结构来存储所有变量和函数。然后,您可以调用 parse
或 parse_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