2 个不稳定版本
0.2.0 | 2022年6月1日 |
---|---|
0.1.0 | 2022年5月1日 |
#918 in 算法
89KB
2K SLoC
Fltrs
易于定义用于查询列表的过滤器。 Fltrs
无任何依赖!
概述
Fltrs 旨在支持在 Rust 中创建易于、快速且可扩展的过滤器,用于可迭代的对象(如 Vec、Array、Map、Set 等)。过滤器基于输入字符串(查询)创建。如果过滤器在运行时创建,例如在 GUI 或命令行工具(CLI)中,这将具有特定优势。
扩展
可以扩展过滤器/查询以满足您的需求
- 创建您自己的 操作符
- 为过滤器值创建转换器(例如:单位的转换)。
查看 Query 构建器页面。
示例
use fltrs::query;
let result: Vec<_> = [3, 2, 1, 4, 5, 7, 5, 4, 3]
.into_iter()
.filter(query("> 1 and < 5").unwrap())
.collect();
assert_eq!(vec![3, 2, 4, 4, 3], result);
use fltrs::query;
let result: Vec<_> = ["Inge", "Petra", "Paul", "Egon", "Peter"]
.into_iter()
.filter(query("contains 'e'").unwrap())
.collect();
assert_eq!(vec!["Inge", "Petra", "Peter"], result);
选项查询
use fltrs::query;
let result: Vec<Option<char>> = [None, Some('a'), None, Some('b'), Some('c'), Some('a')]
.into_iter()
.filter(query(" != 'a' and not = none ").unwrap())
.collect();
assert_eq!(vec![Some('b'), Some('c')], result);
嵌套和非查询
use fltrs::query;
let result: Vec<_> = [3, 2, 1, 4, 5, 7, 5, 4, 3]
.into_iter()
.filter(query("(= 1 or = 5) and > 1").unwrap())
.collect();
assert_eq!(vec![5, 5], result);
use fltrs::query;
let result: Vec<_> = [3, 2, 1, 4, 5, 7, 5, 4, 3]
.into_iter()
.filter(query("not( (= 1 or = 5) and > 1)").unwrap())
.collect();
assert_eq!(vec![3, 2, 1, 4, 7, 4, 3], result);
Fltrs 支持在结构体上执行查询。
这仅在结构体实现了 PathResolver
特性时才可行。
use fltrs::{PathResolver, Filterable, query};
#[derive(PartialEq, Debug)]
struct Point {
name: &'static str,
x: i32,
y: i32,
}
impl PathResolver for Point {
fn path_to_index(path: &str) -> Option<usize> {
match path {
"name" => Some(0),
"x" => Some(1),
"y" => Some(2),
_ => None,
}
}
fn value(&self, idx: usize) -> &dyn Filterable {
match idx {
0 => &self.name,
1 => &self.x,
_ => &self.y,
}
}
}
let result: Vec<Point> =
[
Point { name: "Point_1_3", x: 1, y: 3},
Point { name: "Point_3_3", x: 3, y: 3},
Point { name: "Point_2_6", x: 2, y: 6},
]
.into_iter()
.filter(query(r#"x one_of [3, 7]"#).unwrap())
.collect();
assert_eq!(vec![Point { name: "Point_3_3", x: 3, y: 3}], result);
依赖
~0–510KB