Documentation ¶
Overview ¶
Package tagexpr is an interesting go struct tag expression syntax for field validation, etc.
Copyright 2019 Bytedance Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Example ¶
package main import ( "fmt" tagexpr "github.com/bytedance/go-tagexpr" ) func main() { type T struct { A int `tagexpr:"$<0||$>=100"` B string `tagexpr:"len($)>1 && regexp('^\\w*$')"` C bool `tagexpr:"expr1:(f.g)$>0 && $; expr2:'C must be true when T.f.g>0'"` d []string `tagexpr:"@:len($)>0 && $[0]=='D'; msg:sprintf('invalid d: %v',$)"` e map[string]int `tagexpr:"len($)==$['len']"` e2 map[string]*int `tagexpr:"len($)==$['len']"` f struct { g int `tagexpr:"$"` } } vm := tagexpr.New("tagexpr") t := &T{ A: 107, B: "abc", C: true, d: []string{"x", "y"}, e: map[string]int{"len": 1}, e2: map[string]*int{"len": new(int)}, f: struct { g int `tagexpr:"$"` }{1}, } tagExpr, err := vm.Run(t) if err != nil { panic(err) } fmt.Println(tagExpr.Eval("A")) fmt.Println(tagExpr.Eval("B")) fmt.Println(tagExpr.Eval("C@expr1")) fmt.Println(tagExpr.Eval("C@expr2")) if !tagExpr.Eval("d").(bool) { fmt.Println(tagExpr.Eval("d@msg")) } fmt.Println(tagExpr.Eval("e")) fmt.Println(tagExpr.Eval("e2")) fmt.Println(tagExpr.Eval("f.g")) }
Output: true true true C must be true when T.f.g>0 invalid d: [x y] true false 1
Index ¶
- Constants
- func FakeBool(v interface{}) bool
- func JoinExprSelector(pathFields []string, exprName string) string
- func JoinFieldSelector(path ...string) string
- func RegFunc(funcName string, fn func(...interface{}) interface{}, force ...bool) error
- type Expr
- type ExprHandler
- func (e *ExprHandler) Eval() interface{}
- func (e *ExprHandler) EvalBool() bool
- func (e *ExprHandler) EvalFloat() float64
- func (e *ExprHandler) EvalString() string
- func (e *ExprHandler) ExprSelector() ExprSelector
- func (e *ExprHandler) Path() string
- func (e *ExprHandler) StringSelector() string
- func (e *ExprHandler) TagExpr() *TagExpr
- type ExprNode
- type ExprSelector
- type FieldHandler
- type FieldSelector
- type TagExpr
- func (t *TagExpr) Eval(exprSelector string) interface{}
- func (t *TagExpr) EvalBool(exprSelector string) bool
- func (t *TagExpr) EvalFloat(exprSelector string) float64
- func (t *TagExpr) EvalString(exprSelector string) string
- func (t *TagExpr) Field(fieldSelector string) (fh *FieldHandler, found bool)
- func (t *TagExpr) Range(fn func(*ExprHandler) error) error
- func (t *TagExpr) RangeFields(fn func(*FieldHandler) bool) bool
- type VM
Examples ¶
Constants ¶
const ( // FieldSeparator in the expression selector, // the separator between field names FieldSeparator = "." // ExprNameSeparator in the expression selector, // the separator of the field name and expression name ExprNameSeparator = "@" // DefaultExprName the default name of single model expression DefaultExprName = ExprNameSeparator )
Variables ¶
This section is empty.
Functions ¶
func FakeBool ¶ added in v1.2.1
func FakeBool(v interface{}) bool
FakeBool fakes any type as a boolean.
func JoinExprSelector ¶ added in v1.4.0
JoinExprSelector creates a expression selector.
func JoinFieldSelector ¶ added in v1.4.0
JoinFieldSelector creates a field selector.
Types ¶
type ExprHandler ¶
type ExprHandler struct {
// contains filtered or unexported fields
}
ExprHandler expr handler
func (*ExprHandler) Eval ¶
func (e *ExprHandler) Eval() interface{}
Eval evaluate the value of the struct tag expression. NOTE:
result types: float64, string, bool, nil
func (*ExprHandler) EvalBool ¶
func (e *ExprHandler) EvalBool() bool
EvalBool evaluates the value of the struct tag expression. NOTE:
If the expression value is not 0, '' or nil, return true.
func (*ExprHandler) EvalFloat ¶
func (e *ExprHandler) EvalFloat() float64
EvalFloat evaluates the value of the struct tag expression. NOTE:
If the expression value type is not float64, return 0.
func (*ExprHandler) EvalString ¶
func (e *ExprHandler) EvalString() string
EvalString evaluates the value of the struct tag expression. NOTE:
If the expression value type is not string, return "".
func (*ExprHandler) ExprSelector ¶
func (e *ExprHandler) ExprSelector() ExprSelector
ExprSelector returns the expression selector of ExprSelector type.
func (*ExprHandler) Path ¶
func (e *ExprHandler) Path() string
Path returns the path description of the expression.
func (*ExprHandler) StringSelector ¶
func (e *ExprHandler) StringSelector() string
StringSelector returns the expression selector of string type.
func (*ExprHandler) TagExpr ¶
func (e *ExprHandler) TagExpr() *TagExpr
TagExpr returns the *TagExpr.
type ExprNode ¶
type ExprNode interface { SetParent(ExprNode) Parent() ExprNode LeftOperand() ExprNode RightOperand() ExprNode SetLeftOperand(ExprNode) SetRightOperand(ExprNode) Run(string, *TagExpr) interface{} }
ExprNode expression interface
type ExprSelector ¶ added in v1.4.0
type ExprSelector string
ExprSelector expression selector
func (ExprSelector) Field ¶ added in v1.4.0
func (e ExprSelector) Field() string
Field returns the field selector it belongs to.
func (ExprSelector) Name ¶ added in v1.4.0
func (e ExprSelector) Name() string
Name returns the name of the expression.
func (ExprSelector) ParentField ¶
func (e ExprSelector) ParentField() (string, bool)
ParentField returns the parent field selector it belongs to.
func (ExprSelector) Split ¶ added in v1.4.0
func (e ExprSelector) Split() (field FieldSelector, name string)
Split returns the field selector and the expression name.
func (ExprSelector) String ¶ added in v1.4.0
func (e ExprSelector) String() string
String returns string type value.
type FieldHandler ¶ added in v1.4.0
type FieldHandler struct {
// contains filtered or unexported fields
}
FieldHandler field handler
func (*FieldHandler) EvalFuncs ¶ added in v1.4.0
func (f *FieldHandler) EvalFuncs() map[ExprSelector]func() interface{}
EvalFuncs returns the tag expression eval functions.
func (*FieldHandler) FieldSelector ¶ added in v1.4.0
func (f *FieldHandler) FieldSelector() FieldSelector
FieldSelector returns the field selector of FieldSelector type.
func (*FieldHandler) StringSelector ¶ added in v1.4.0
func (f *FieldHandler) StringSelector() string
StringSelector returns the field selector of string type.
func (*FieldHandler) StructField ¶ added in v1.4.0
func (f *FieldHandler) StructField() reflect.StructField
StructField returns the field StructField object.
type FieldSelector ¶ added in v1.4.0
type FieldSelector string
FieldSelector expression selector
func (FieldSelector) Name ¶ added in v1.4.0
func (f FieldSelector) Name() string
Name returns the current field name.
func (FieldSelector) Parent ¶
func (f FieldSelector) Parent() (string, bool)
Parent returns the parent FieldSelector.
func (FieldSelector) Split ¶ added in v1.4.0
func (f FieldSelector) Split() (paths []string, name string)
Split returns the path segments and the current field name.
func (FieldSelector) String ¶ added in v1.4.0
func (f FieldSelector) String() string
String returns string type value.
type TagExpr ¶
type TagExpr struct {
// contains filtered or unexported fields
}
TagExpr struct tag expression evaluator
func (*TagExpr) Eval ¶
Eval evaluates the value of the struct tag expression by the selector expression. NOTE:
format: fieldName, fieldName.exprName, fieldName1.fieldName2.exprName1 result types: float64, string, bool, nil
func (*TagExpr) EvalBool ¶ added in v1.1.0
EvalBool evaluates the value of the struct tag expression by the selector expression. NOTE:
If the expression value is not 0, '' or nil, return true.
func (*TagExpr) EvalFloat ¶ added in v1.1.0
EvalFloat evaluates the value of the struct tag expression by the selector expression. NOTE:
If the expression value type is not float64, return 0.
func (*TagExpr) EvalString ¶ added in v1.1.0
EvalString evaluates the value of the struct tag expression by the selector expression. NOTE:
If the expression value type is not string, return "".
func (*TagExpr) Field ¶ added in v1.1.3
func (t *TagExpr) Field(fieldSelector string) (fh *FieldHandler, found bool)
Field returns the field handler specified by the selector.
func (*TagExpr) Range ¶
func (t *TagExpr) Range(fn func(*ExprHandler) error) error
Range loop through each tag expression. When fn returns false, interrupt traversal and return false. NOTE:
eval result types: float64, string, bool, nil
func (*TagExpr) RangeFields ¶ added in v1.4.0
func (t *TagExpr) RangeFields(fn func(*FieldHandler) bool) bool
RangeFields loop through each field. When fn returns false, interrupt traversal and return false.
type VM ¶
type VM struct {
// contains filtered or unexported fields
}
VM struct tag expression interpreter
func New ¶
New creates a tag expression interpreter that uses tagName as the tag name. NOTE:
If no tagName is specified, no tag expression will be interpreted, but still can operate the various fields.
func (*VM) Run ¶
Run returns the tag expression handler of the @structOrStructPtrOrReflectValue. NOTE:
If the structure type has not been warmed up, it will be slower when it is first called.