Documentation ¶
Overview ¶
TICKscript is a simple invocation chaining DSL.
See the examples for how its used and example syntax of the DSL.
Index ¶
- Constants
- Variables
- func Evaluate(script string, scope *Scope) (err error)
- func Format(script string) (string, error)
- func SetLogger(l *log.Logger)
- type BinaryNode
- type BoolNode
- type ChainNode
- type CommentNode
- type DeclarationNode
- type DurationNode
- type DynamicMethod
- type Func
- type Funcs
- type FunctionNode
- type IdentifierNode
- type LambdaNode
- type ListNode
- type Node
- type NumberNode
- type Position
- type ReferenceNode
- type ReflectionDescriber
- func (r *ReflectionDescriber) CallChainMethod(name string, args ...interface{}) (interface{}, error)
- func (r *ReflectionDescriber) Desc() string
- func (r *ReflectionDescriber) HasChainMethod(name string) bool
- func (r *ReflectionDescriber) HasProperty(name string) bool
- func (r *ReflectionDescriber) Property(name string) interface{}
- func (r *ReflectionDescriber) SetProperty(name string, values ...interface{}) (interface{}, error)
- type RegexNode
- type Scope
- type SelfDescriber
- type StarNode
- type StatefulExpr
- type StringNode
- type UnaryNode
Examples ¶
Constants ¶
const ( TokenError tokenType = iota TokenEOF TokenVar TokenAsgn TokenDot TokenPipe TokenAt TokenIdent TokenReference TokenLambda TokenNumber TokenString TokenDuration TokenLParen TokenRParen TokenComma TokenNot TokenTrue TokenFalse TokenRegex TokenComment TokenPlus TokenMinus TokenMult TokenDiv TokenMod TokenAnd TokenOr TokenEqual TokenNotEqual TokenLess TokenGreater TokenLessEqual TokenGreaterEqual TokenRegexEqual TokenRegexNotEqual )
const ( KW_And = "AND" KW_Or = "OR" KW_True = "TRUE" KW_False = "FALSE" KW_Var = "var" KW_Lambda = "lambda" )
Variables ¶
var ErrEmptyStack = errors.New("stack is empty")
var ErrInvalidExpr = errors.New("expression is invalid, could not evaluate")
var ErrNotFloat = errors.New("value is not a float")
Functions ¶
func Evaluate ¶
Parse and evaluate a given script for the scope. This evaluation method uses reflection to call methods on objects within the scope.
Example ¶
package main import ( "fmt" ) type Process struct { Name string Children []*Process } func (p *Process) Spawn() *Process { child := &Process{} p.Children = append(p.Children, child) return child } func (p *Process) String() string { return fmt.Sprintf("{%q %s}", p.Name, p.Children) } func main() { //Run a test that evaluates the DSL against the Process struct. script := ` //Name the parent parent.name('parent') // Spawn a first child var child1 = parent|spawn() // Name the first child child1.name('child1') //Spawn a grandchild and name it child1|spawn().name('grandchild') //Spawn a second child and name it parent|spawn().name('child2') ` scope := NewScope() parent := &Process{} scope.Set("parent", parent) err := Evaluate(script, scope) if err != nil { fmt.Println(err) } fmt.Println(parent) }
Output: {"parent" [{"child1" [{"grandchild" []}]} {"child2" []}]}
Types ¶
type BinaryNode ¶
type BinaryNode struct { Left Node Right Node Operator tokenType Comment Node Parens bool MultiLine bool // contains filtered or unexported fields }
binaryNode holds two arguments and an operator.
func (*BinaryNode) Format ¶ added in v0.12.0
func (n *BinaryNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*BinaryNode) String ¶
func (n *BinaryNode) String() string
type BoolNode ¶
boolNode holds one argument and an operator.
type ChainNode ¶ added in v0.12.0
type ChainNode struct { Left Node Right Node Operator tokenType Comment Node // contains filtered or unexported fields }
type CommentNode ¶ added in v0.12.0
type CommentNode struct { Comments []string // contains filtered or unexported fields }
Hold the contents of a comment
func (*CommentNode) Format ¶ added in v0.12.0
func (n *CommentNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*CommentNode) String ¶ added in v0.12.0
func (n *CommentNode) String() string
type DeclarationNode ¶ added in v0.12.0
type DeclarationNode struct { Left *IdentifierNode Right Node Comment Node // contains filtered or unexported fields }
func (*DeclarationNode) Format ¶ added in v0.12.0
func (n *DeclarationNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*DeclarationNode) String ¶ added in v0.12.0
func (n *DeclarationNode) String() string
type DurationNode ¶
type DurationNode struct { Dur time.Duration //the duration Comment Node // contains filtered or unexported fields }
durationNode holds a number: signed or unsigned integer or float. The value is parsed and stored under all the types that can represent the value. This simulates in a small amount of code the behavior of Go's ideal constants.
func (*DurationNode) Format ¶ added in v0.12.0
func (n *DurationNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*DurationNode) String ¶
func (n *DurationNode) String() string
type DynamicMethod ¶ added in v0.10.0
type DynamicMethod func(self interface{}, args ...interface{}) (interface{}, error)
type Func ¶
type Func interface { Reset() Call(...interface{}) (interface{}, error) }
A callable function from within the expression
type FunctionNode ¶
type FunctionNode struct { Type funcType Func string // The identifier Args []Node Comment Node MultiLine bool // contains filtered or unexported fields }
Holds the a function call with its args
func (*FunctionNode) Format ¶ added in v0.12.0
func (n *FunctionNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*FunctionNode) String ¶
func (n *FunctionNode) String() string
type IdentifierNode ¶
type IdentifierNode struct { Ident string // The identifier Comment Node // contains filtered or unexported fields }
Holds the textual representation of an identifier
func (*IdentifierNode) Format ¶ added in v0.12.0
func (n *IdentifierNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*IdentifierNode) String ¶
func (n *IdentifierNode) String() string
type LambdaNode ¶
Represents the begining of a lambda expression
func (*LambdaNode) Format ¶ added in v0.12.0
func (n *LambdaNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*LambdaNode) String ¶
func (n *LambdaNode) String() string
type ListNode ¶
type ListNode struct { Nodes []Node // contains filtered or unexported fields }
Holds a function call with its args
type NumberNode ¶
type NumberNode struct { IsInt bool // Number has an integral value. IsFloat bool // Number has a floating-point value. Int64 int64 // The integer value. Float64 float64 // The floating-point value. Comment Node // contains filtered or unexported fields }
numberNode holds a number: signed or unsigned integer or float. The value is parsed and stored under all the types that can represent the value. This simulates in a small amount of code the behavior of Go's ideal constants.
func (*NumberNode) Format ¶ added in v0.12.0
func (n *NumberNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*NumberNode) String ¶
func (n *NumberNode) String() string
type ReferenceNode ¶
type ReferenceNode struct { Reference string // The field reference Comment Node // contains filtered or unexported fields }
Holds the textual representation of an identifier
func (*ReferenceNode) Format ¶ added in v0.12.0
func (n *ReferenceNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*ReferenceNode) String ¶
func (n *ReferenceNode) String() string
type ReflectionDescriber ¶ added in v0.10.0
type ReflectionDescriber struct {
// contains filtered or unexported fields
}
Wraps any object as a SelfDescriber using reflection.
func NewReflectionDescriber ¶ added in v0.10.0
func NewReflectionDescriber(obj interface{}) (*ReflectionDescriber, error)
func (*ReflectionDescriber) CallChainMethod ¶ added in v0.12.0
func (r *ReflectionDescriber) CallChainMethod(name string, args ...interface{}) (interface{}, error)
func (*ReflectionDescriber) Desc ¶ added in v0.10.0
func (r *ReflectionDescriber) Desc() string
func (*ReflectionDescriber) HasChainMethod ¶ added in v0.12.0
func (r *ReflectionDescriber) HasChainMethod(name string) bool
Using reflection check if the object has the method or field. A field is a valid method because we can set it via reflection too.
func (*ReflectionDescriber) HasProperty ¶ added in v0.10.0
func (r *ReflectionDescriber) HasProperty(name string) bool
Using reflection check if the object has a field with the property name.
func (*ReflectionDescriber) Property ¶ added in v0.10.0
func (r *ReflectionDescriber) Property(name string) interface{}
func (*ReflectionDescriber) SetProperty ¶ added in v0.10.0
func (r *ReflectionDescriber) SetProperty(name string, values ...interface{}) (interface{}, error)
type RegexNode ¶
type RegexNode struct { Regex *regexp.Regexp Comment Node // contains filtered or unexported fields }
Holds the textual representation of a regex literal
type Scope ¶
type Scope struct {
// contains filtered or unexported fields
}
Contains a set of variables references and their values.
func (*Scope) DynamicMethod ¶ added in v0.10.0
func (s *Scope) DynamicMethod(name string) DynamicMethod
func (*Scope) SetDynamicMethod ¶ added in v0.10.0
func (s *Scope) SetDynamicMethod(name string, m DynamicMethod)
type SelfDescriber ¶ added in v0.10.0
type SelfDescriber interface { //A description the object Desc() string HasChainMethod(name string) bool CallChainMethod(name string, args ...interface{}) (interface{}, error) HasProperty(name string) bool Property(name string) interface{} SetProperty(name string, args ...interface{}) (interface{}, error) }
Interface for interacting with objects. If an object does not self describe via this interface than a reflection based implemenation will be used.
type StarNode ¶
type StarNode struct { Comment Node // contains filtered or unexported fields }
Represents a standalone '*' token.
type StatefulExpr ¶
Expression functions are stateful. Their state is updated with each call to the function. A StatefulExpr is a Node and its associated function state.
func NewStatefulExpr ¶
func NewStatefulExpr(n Node) *StatefulExpr
func (*StatefulExpr) EvalNum ¶
func (s *StatefulExpr) EvalNum(scope *Scope) (interface{}, error)
type StringNode ¶
type StringNode struct { Literal string // The string literal TripleQuotes bool Comment Node // contains filtered or unexported fields }
Holds the textual representation of a string literal
func (*StringNode) Format ¶ added in v0.12.0
func (n *StringNode) Format(buf *bytes.Buffer, indent string, onNewLine bool)
func (*StringNode) String ¶
func (n *StringNode) String() string