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.