lua-resty-expr

opm 包用于 => 一个微型 DSL 用于评估 APISIX 内部使用的表达式。

$ opm get xiangnanscu/lua-resty-expr

lua-resty-expr

名称

一个微型 DSL 用于评估 APISIX 内部使用的表达式。

[!许可证](https://github.com/api7/lua-resty-expr/blob/main/LICENSE)

该项目一直致力于微服务 API 网关 Apache APISIX

该项目由 深圳市智柳科技有限公司 开源。

除了这个开源版本,我们公司还提供更强大、更高性能的商业版本,并提供技术支持。如果您对我们的商业版本感兴趣,请 联系我们

概述

     location / {
         content_by_lua_block {
            local expr = require("resty.expr.v1")
            local ex = expr.new({
                {"arg_name", "==", "json"},
                {"arg_weight", ">", 10},
                {"arg_weight", "!", ">", 15},
            })
    
            -- equal to
            -- 'ngx.say(ngx.var.arg_name == "json" and ngx.var.arg_weight > 10 and not ngx.var.arg_weight > 15)'
            ngx.say(ex:eval(ngx.var))
         }
     }


     location / {
         content_by_lua_block {
            local expr = require("resty.expr.v1")
            local ex = expr.new({
                "!AND",
                {"arg_name", "==", "json"},
                {
                    "OR",
                    {"arg_weight", ">", 10},
                    {"arg_height", "!", ">", 15},
                }
            })
    
            -- equal to
            -- 'ngx.say(not (ngx.var.arg_name == "json" and
            --               (ngx.var.arg_weight > 10 or
            --                not ngx.var.arg_height > 15))'
            ngx.say(ex:eval(ngx.var))
         }
     }

方法

new

语法: ex, err = expr.new(rule)

创建一个表达式对象,可以在以后进行评估。

规则的语法是一个节点的数组表。

第一个节点可以是表达式或逻辑运算符。其余节点可以是表达式或另一个包含其逻辑运算符和表达式的节点数组。

每个表达式都是一个包含三个或四个元素的数组表。

    {
        {"var name (aka. left value)", "optional '!' operator", "operator", "const value (aka. right value)"},
        ...
    }

逻辑运算符可以是以下之一

  • OR

  • AND

  • !OR: not (expr1 or expr2 or ...)

  • !AND: not (expr1 and expr2 and ...)

它们的组合可以像

    [
        "AND",
        ["arg_name", "==", "json"],
        [
            "!OR",
            ["arg_weight", ">", 10],
            ["arg_height", "!", ">", 15]
        ]
    ]

运算符列表

|运算符|描述|示例| |--------|-----------|-------| |== |等于 |{"arg_name", "==", "json"}| |~= |不等于 |{"arg_name", "~=", "json"}| |> |大于|{"arg_age", ">", 24}| |< |小于 |{"arg_age", "<", 24}| |~~ |正则匹配|{"arg_name", "~~", "[a-z]+"}| |~ |不区分大小写的正则匹配|{"arg_name", "~", "[a-z]+"}| |in |在数组中查找|{"arg_name", "in", {"1","2"}}| |has |左值数组中是否包含右值|{"graphql_root_fields", "has", "repo"}| |! |反转结果|{"arg_name", "!", "~~", "[a-z]+"}|

eval

语法: ok, err = ex:eval(ctx)

根据ctx评估表达式。如果ctx缺失,则默认使用ngx.var

    local ok = rx:eval()
    if ok == nil then
        log_err("failed to eval expression: ", err)
        return false
    end
    
    return ok

安装

编译并安装

    make install

开发环境

安装依赖项

    make deps

作者

Nan Xiang(@xiangnanscu)

许可证

apache2

版本