#filter #query #gui #command-line #cli

fltrs

用于查询列表的过滤器

2 个不稳定版本

0.2.0 2022年6月1日
0.1.0 2022年5月1日

#918 in 算法

Apache-2.0

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