# sapeur **Repository Path**: endpoint_rust/sapeur ## Basic Information - **Project Name**: sapeur - **Description**: 这是一个rust实现的配置解析映射工具,支持各种匹配模式及其复杂组合。 - **Primary Language**: Rust - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-04-26 - **Last Updated**: 2024-06-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sapeur #### 介绍 这是一个灵活的自定义配置解析库,支持复杂的配置逻辑抽象解析,对于一些解析性能有很高要求的场景,sapeur并不适合。通常我们用于离线或者实时复杂配置解析场景。 我在写事件编排引擎[event_flow](https://gitee.com/rust_endpoint/event_flow)的时候, 需要一种支持灵活自定义的复杂配置抽象解析,以支持编排引擎对事件的复杂灵活处理、判断等(通过自定义配置语法)。 之前借鉴了[dynparser](https://gitee.com/rust_endpoint/dynparser)的思路做了配置映射,自己扩展了Repeat、Nested(支持((a and b) or c)风格的语法解析, 同时扩展了匹配失败回退功能,配置匹配失败错误位置提示等功能,在一定程度上丰富了语法表示,但是对于多级自我嵌套这种场景无法自动适应,需要提前定义规则。 也有借鉴arrow-datafusion/Polars的思路,用sqlparser进行sql语法风格的配置解析并映射到LogicalPlan,但是我所需要的事件处理 配置灵活度是sql语法达不到的。不过arrow-datafusion/Polars的conf到LogicalPlan再到PhysicalPlan的映射思路值得借鉴。 后续接触到了[chumsky](https://gitee.com/rust_endpoint/chumsky),一切围绕Parser trait, 并在此基础上构建复杂组合的Parser,满足配置映射的需求。 综合以上思路,自己造一个轮子,支持复杂配置语法解析,支持配置模式组合! ### 各种配置模式及其组合介绍 #### and 同时满足匹配模式A->O和匹配模式B->U,输出(O,U) #### try_and 满足匹配模式A->O的时候,尝试去匹配模式B->U, 输出(O,Option),模式B匹配成功才会推动匹配位置后移 #### or 满足匹配模式A->O或者匹配模式B->O,输出O #### not 不满足匹配模式A->O,输出() #### map 满足匹配模式A->O,对匹配结果进行转换F(O)->U,输出U #### map_end 满足匹配模式A->O,并且是匹配到输入流的末尾了,对匹配结果进行转换F(O)->U,输出U #### map_end_option 满足匹配模式A->O,并且是匹配到输入流的末尾了,对匹配结果进行转换F(O)->Option,如果转换结果是Some(U),则输出U,否则算匹配失败。 #### repeated 重复匹配模式A->O,最少重复次数从0开始,最多重复次数可以不配置 #### then_ignore 满足匹配模式A->O,然后忽略配置模式B->U,模式A、B都必须匹配成功,输出O #### then_try_ignore 满足匹配模式A->O,然后尝试匹配模式B->U,模式A必须匹配成功,模式B可以匹配失败,输出O #### ignore_then 忽略匹配模式A->O,然后匹配模式B->U,模式A、B都必须匹配成功,输出U #### try_ignore_then 尝试忽略匹配模式A->O,然后匹配模式B->U,模式A可以匹配失败,模式B必须匹配成功,输出U #### expand_by 匹配模式A->O,然后匹配模式A的左右可以有匹配模式B->U,输出O #### expand_by_repeated 匹配模式A->O,然后匹配模式A的左右可以有匹配模式B->U的重复(0到无数次),输出O #### padded_by 匹配模式A->O的try_ignore_then(B->U),然后then_try_ignore(B->U),的封装,输出O #### separated_by 匹配模式A->O,以匹配模式B->U进行间隔,输出Vec #### delimited_by 匹配模式A->O,以匹配模式B->U和C->V分隔(B A C),输出O 以BC成对的方式剥离最左边的一对分隔符,然后以子Stream来匹配A和可能的剩余Stream继续后续的匹配 #### logical_comb 对匹配模式A->O的逻辑组合(a and b) or c等 抽象出逻辑组合的元素 left B->O1 right C->O2 and D->O3 or E->O4 ### 配置解析映射介绍 由于我主要是把配置映射成灵活的rust enum,和递归的函数表示,所以下面重点介绍一下如何利用复杂的配置模式来解析。