PageSourceSearch

https://sado0823.github.io/assets/js/6aa0f405.d5fb270f.js

js sado0823.github.io collected 2026-10-03 09:54:13 UTC 11,950 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkgo_kitx_webside=self.webpackChunkgo_kitx_webside||[]).push([[3956],{3905:function(e,n,t){t.d(n,{Zo:function(){return m},kt:function(){return f}});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),u=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},m=function(e){var n=u(e.components);return r.createElement(p.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},c=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),c=u(t),f=a,d=c["".concat(p,".").concat(f)]||c[f]||s[f]||i;return t?r.createElement(d,l(l({ref:n},m),{},{components:t})):r.createElement(d,l({ref:n},m))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,l=new Array(i);l[0]=c;var o={};for(var p in n)hasOwnProperty.call(n,p)&&(o[p]=n[p]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u<i;u++)l[u]=t[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,t)}c.displayName="MDXCreateElement"},4185:function(e,n,t){t.r(n),t.d(n,{assets:function(){return m},contentTitle:function(){return p},default:function(){return f},frontMatter:function(){return o},metadata:function(){return u},toc:function(){return s}});var r=t(7462),a=t(3366),i=(t(7294),t(3905)),l=["components"],o={sidebar_position:2,id:"ast_rule",title:"ast rule"},p=void 0,u={unversionedId:"kit/ast_rule",id:"kit/ast_rule",title:"ast rule",description:"\u89c4\u5219\u5f15\u64ce",source:"@site/docs/kit/01-ast_rule.md",sourceDirName:"kit",slug:"/kit/ast_rule",permalink:"/docs/kit/ast_rule",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,id:"ast_rule",title:"ast rule"},sidebar:"tutorialSidebar",previous:{title:"KIT",permalink:"/docs/category/kit"},next:{title:"config",permalink:"/docs/kit/config"}},m={},s=[{value:"<strong>Supported Operator</strong>",id:"supported-operator",level:2},{value:"ExampleDo",id:"exampledo",level:2},{value:"ExampleNew",id:"examplenew",level:2},{value:"ExampleWithCustomFn",id:"examplewithcustomfn",level:2},{value:"ExampleWithFullFunctional",id:"examplewithfullfunctional",level:2}],c={toc:s};function f(e){var n=e.components,t=(0,a.Z)(e,l);return(0,i.kt)("wrapper",(0,r.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"\u89c4\u5219\u5f15\u64ce"),(0,i.kt)("h1",{id:"ast-rule-engine"},"Ast Rule Engine"),(0,i.kt)("h2",{id:"supported-operator"},(0,i.kt)("strong",{parentName:"h2"},"Supported Operator")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"comparator"),": ",(0,i.kt)("inlineCode",{parentName:"p"},">")," ",(0,i.kt)("inlineCode",{parentName:"p"},">=")," ",(0,i.kt)("inlineCode",{parentName:"p"},"<")," ",(0,i.kt)("inlineCode",{parentName:"p"},"<=")," ",(0,i.kt)("inlineCode",{parentName:"p"},"=="))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"bitwise"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," ",(0,i.kt)("inlineCode",{parentName:"p"},"|")," ",(0,i.kt)("inlineCode",{parentName:"p"},"^"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"bitwiseShift"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"<<")," ",(0,i.kt)("inlineCode",{parentName:"p"},">>"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"additive"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"+")," ",(0,i.kt)("inlineCode",{parentName:"p"},"-"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"multiplicative"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"*")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/")," ",(0,i.kt)("inlineCode",{parentName:"p"},"%"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"prefix"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"!"),"(NOT)  ",(0,i.kt)("inlineCode",{parentName:"p"},"-"),"(NEGATE)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"logic"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"&&")," ",(0,i.kt)("inlineCode",{parentName:"p"},"||"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"func call"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"(")," ",(0,i.kt)("inlineCode",{parentName:"p"},")")," ",(0,i.kt)("inlineCode",{parentName:"p"},",")," ",(0,i.kt)("inlineCode",{parentName:"p"},"func"),"(do func call with build in function and custom function)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"params type"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"Ident")," ",(0,i.kt)("inlineCode",{parentName:"p"},"Number")," ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ",(0,i.kt)("inlineCode",{parentName:"p"},"Bool")," ",(0,i.kt)("inlineCode",{parentName:"p"},"array"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"struct")," (DO Not support ",(0,i.kt)("inlineCode",{parentName:"p"},"func")," )")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"recursive params call with ",(0,i.kt)("inlineCode",{parentName:"strong"},".")),": ",(0,i.kt)("inlineCode",{parentName:"p"},"map.mapKey.mapKey.arrayIndex.structFiledName")," (foo.bar.2.Name)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Link"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sado0823/go-kitx/blob/master/kit/rule/example_test.go"},"See Example Here")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sado0823/go-kitx/blob/master/kit/rule/rule_params_test.go"}
1,"See Unit Test Here"))))),(0,i.kt)("h2",{id:"exampledo"},"ExampleDo"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-go"},'import (\n    "context"\n    "fmt"\n    "unicode/utf8"\n    \n    "github.com/sado0823/go-kitx/kit/rule"\n)\n\nfunc ExampleDo() {\n\n    params := map[string]interface{}{"foo": 1}\n    \n    value, err := rule.Do(context.Background(), `foo + 1`, params)\n    if err != nil {\n        fmt.Println(err)\n    }\n    \n    fmt.Print(value)\n    \n    // Output:\n    // 2\n}\n')),(0,i.kt)("h2",{id:"examplenew"},"ExampleNew"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-go"},'import (\n    "context"\n    "fmt"\n    "unicode/utf8"\n    \n    "github.com/sado0823/go-kitx/kit/rule"\n)\n\nfunc ExampleNew() {\n    params := map[string]interface{}{"foo": 1}\n    \n    parser, err := rule.New(context.Background(), `foo + 1`)\n    if err != nil {\n        fmt.Println(err)\n    }\n    \n    value, err := parser.Eval(params)\n    if err != nil {\n        fmt.Println(err)\n    }\n    \n    fmt.Print(value)\n    \n    // Output:\n    // 2\n}\n')),(0,i.kt)("h2",{id:"examplewithcustomfn"},"ExampleWithCustomFn"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-go"},'import (\n    "context"\n    "fmt"\n    "unicode/utf8"\n    \n    "github.com/sado0823/go-kitx/kit/rule"\n)\n\nfunc ExampleWithCustomFn() {\n    params := map[string]interface{}{"foo": 1}\n    \n    value, err := rule.Do(\n        \n        context.Background(),\n        \n        `func in(foo,2,"abc",1) && func strlen("abc") == 3 && func isTrue(true) && func isTrue(false) == false`,\n        \n        params,\n        \n        /* custom func `strlen` return args[0]\'s count with float64 type */\n        rule.WithCustomFn("strlen", func(evalParam interface{}, arguments ...interface{}) (interface{}, error) {\n            if len(arguments) == 0 {\n                return 0, nil\n            }\n            return float64(utf8.RuneCount([]byte(arguments[0].(string)))), nil\n        }),\n        \n         /*custom func `isTrue` return if args[0] is true with bool type*/\n        rule.WithCustomFn("isTrue", func(evalParam interface{}, arguments ...interface{}) (interface{}, error) {\n            if len(arguments) == 0 {\n                return 0, nil\n            }\n            return arguments[0].(bool) == true, nil\n        }),\n    )\n    if err != nil {\n        fmt.Println(err)\n    }\n    \n    fmt.Print(value)\n    \n    // Output:\n    // true\n}\n')),(0,i.kt)("h2",{id:"examplewithfullfunctional"},"ExampleWithFullFunctional"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-go"},'import (\n    "context"\n    "fmt"\n    "unicode/utf8"\n    \n    "github.com/sado0823/go-kitx/kit/rule"\n)\n\nfunc ExampleWithCustomFn() {\n    type Child struct {\n        Name   string\n        Age    int\n        IsVIP  bool\n        Map    map[string]int\n        Nested *Child\n    }\n    type User struct {\n        Name     string\n        Age      int\n        IsVIP    bool\n        Nil      interface{}\n        Children []Child\n    }\n    \n    params := &User{\n        Name:  "foo",\n        Age:   18,\n        IsVIP: true,\n        Nil:   nil,\n        Children: []Child{\n            {\n                // 0\n                Name: "child0", Age: 0, IsVIP: false, Map: map[string]int{"child0": 0}, Nested: &Child{Name: "child0-child"},\n            },\n            {\n                // 1\n                Name: "child1", Age: 1, IsVIP: true, Map: map[string]int{"child1": 1}, Nested: &Child{},\n            },\n        },\n    }\n    \n    value, err := rule.Do(\n        context.Background(),\n        `Name == "foo" && \n        (Name + "bar" == "foobar") && \n        (Age == 17 || Age == 18) &&\n        (Age + 1 == 19) && \n        func in(Name,2,"foo",1) && \n        func strlen("abc") == 3 && \n        func isVIP() && \n        Children.1.Name == "child1" && \n        Children.1.Map.child1 == 1 && \n        Children.0.Nested.Name == "child0-child"`,\n        params,\n        /* custom func `strlen` return args[0]\'s count with float64 type */\n        rule.WithCustomFn("strlen", func(evalParam interface{}, arguments ...interface{}) (interface{}, error) {\n            if len(arguments) == 0 {\n            return 0, nil\n            }\n            return float64(utf8.RuneCount([]byte(arguments[0].(string)))), nil\n        }),\n        /*custom func `isVIP` return if evalParam.IsVIP is true with bool t
1ype*/\n        rule.WithCustomFn("isVIP", func(evalParam interface{}, arguments ...interface{}) (interface{}, error) {\n            userCurrent := evalParam.(*User)\n            return userCurrent.IsVIP == true, nil\n        }),\n    )\n    if err != nil {\n        fmt.Println(err)\n    }\n    \n    fmt.Print(value)\n    \n    // Output:\n    // true\n}\n')))}f.isMDXComponent=!0}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.