Documentation ¶
Index ¶
- Constants
- Variables
- func MustParseStatement(input string) interface{}
- func MustParseStatements(input string) []interface{}
- func Parse(filename string, b []byte, opts ...Option) (interface{}, error)
- func ParseFile(filename string, opts ...Option) (interface{}, error)
- func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error)
- func ParseStatement(input string) (interface{}, error)
- func ParseStatements(filename, input string) ([]interface{}, error)
- func RegisterBuiltin(b *Builtin)
- func Walk(v Visitor, x interface{})
- func WalkClosures(x interface{}, f func(interface{}) bool)
- func WalkRefs(x interface{}, f func(Ref) bool)
- type Array
- type ArrayComprehension
- type Body
- func (body Body) Contains(x *Expr) bool
- func (body Body) Equal(other Body) bool
- func (body Body) Hash() int
- func (body Body) IsGround() bool
- func (body Body) Loc() *Location
- func (body Body) OutputVars(safe VarSet) VarSet
- func (body Body) String() string
- func (body Body) Vars(skipClosures bool) VarSet
- type Boolean
- type Builtin
- type Compiler
- type DocKind
- type Expr
- func (expr *Expr) Complement() *Expr
- func (expr *Expr) Equal(other *Expr) bool
- func (expr *Expr) Hash() int
- func (expr *Expr) IsEquality() bool
- func (expr *Expr) IsGround() bool
- func (expr *Expr) OutputVars(safe VarSet) VarSet
- func (expr *Expr) String() string
- func (expr *Expr) UnmarshalJSON(bs []byte) error
- func (expr *Expr) Vars(skipClosures bool) VarSet
- type GenericVisitor
- type Import
- type Location
- type Module
- type ModuleTreeNode
- type Null
- type Number
- type Object
- func (obj Object) Diff(other Object) Object
- func (obj Object) Equal(other Value) bool
- func (obj Object) Hash() int
- func (obj Object) Intersect(other Object) [][3]*Term
- func (obj Object) IsGround() bool
- func (obj Object) Merge(other Object) (Object, bool)
- func (obj Object) Query(ref Ref, iter QueryIterator) error
- func (obj Object) String() string
- type Option
- type Package
- type QueryIterator
- type Ref
- type Rule
- type Statement
- type String
- type Term
- func ArrayComprehensionTerm(term *Term, body Body) *Term
- func ArrayTerm(a ...*Term) *Term
- func BooleanTerm(b bool) *Term
- func Item(key, value *Term) [2]*Term
- func MustParseTerm(input string) *Term
- func NullTerm() *Term
- func NumberTerm(n float64) *Term
- func ObjectTerm(o ...[2]*Term) *Term
- func ParseTerm(input string) (*Term, error)
- func RefTerm(r ...*Term) *Term
- func StringTerm(s string) *Term
- func VarTerm(v string) *Term
- type Value
- type Var
- type VarSet
- type Visitor
Constants ¶
const ( // CompleteDoc represents a document that is completely defined by the rule. CompleteDoc = iota // PartialSetDoc represents a set document that is partially defined by the rule. PartialSetDoc = iota // PartialObjectDoc represents an object document that is partially defined by the rule. PartialObjectDoc = iota )
Variables ¶
var Abs = &Builtin{ Name: Var("abs"), NumArgs: 2, TargetPos: []int{1}, }
Abs returns the number without its sign.
var BuiltinMap map[Var]*Builtin
BuiltinMap provides a convenient mapping of built-in names to built-in definitions.
var Builtins []*Builtin
Builtins is the registry of built-in functions supported by OPA. Call RegisterBuiltin to add a new built-in.
var Count = &Builtin{ Name: Var("count"), NumArgs: 2, TargetPos: []int{1}, }
Count takes a collection and counts the number of elements in it.
var DefaultBuiltins = [...]*Builtin{ Equality, GreaterThan, GreaterThanEq, LessThan, LessThanEq, NotEqual, Plus, Minus, Multiply, Divide, Round, Abs, Count, Sum, Max, ToNumber, }
DefaultBuiltins is the registry of built-in functions supported in OPA by default. When adding a new built-in function to OPA, update this list.
var DefaultRootDocument = VarTerm("data")
DefaultRootDocument is the default root document. All package directives inside source files are implicitly prefixed with the DefaultRootDocument value.
var Divide = &Builtin{ Name: Var("div"), NumArgs: 3, TargetPos: []int{2}, }
Divide divides the first number by the second number.
var Equality = &Builtin{ Name: Var("="), Alias: Var("eq"), NumArgs: 2, TargetPos: []int{0, 1}, }
Equality represents the "=" operator.
var GreaterThan = &Builtin{ Name: Var(">"), Alias: Var("gt"), NumArgs: 2, }
GreaterThan represents the ">" comparison operator.
var GreaterThanEq = &Builtin{ Name: Var(">="), Alias: Var("gte"), NumArgs: 2, }
GreaterThanEq represents the ">=" comparison operator.
var Keywords = [...]string{
"package", "import", "not",
}
Keywords is an array of reserved keywords in the language. These are reserved names that cannot be used for variables.
var LessThan = &Builtin{ Name: Var("<"), Alias: Var("lt"), NumArgs: 2, }
LessThan represents the "<" comparison operator.
var LessThanEq = &Builtin{ Name: Var("<="), Alias: Var("lte"), NumArgs: 2, }
LessThanEq represents the "<=" comparison operator.
var Max = &Builtin{ Name: Var("max"), NumArgs: 2, TargetPos: []int{1}, }
Max returns the maximum value in a collection.
var Minus = &Builtin{ Name: Var("minus"), NumArgs: 3, TargetPos: []int{2}, }
Minus subtracts the second number from the first number.
var Multiply = &Builtin{ Name: Var("mul"), NumArgs: 3, TargetPos: []int{2}, }
Multiply multiplies two numbers together.
var NotEqual = &Builtin{ Name: Var("!="), Alias: Var("neq"), NumArgs: 2, }
NotEqual represents the "!=" comparison operator.
var Plus = &Builtin{ Name: Var("plus"), NumArgs: 3, TargetPos: []int{2}, }
Plus adds two numbers together.
var ReservedVars = NewVarSet(DefaultRootDocument.Value.(Var))
ReservedVars is the set of reserved variable names.
var Round = &Builtin{ Name: Var("round"), NumArgs: 2, TargetPos: []int{1}, }
Round rounds the number up to the nearest integer.
var Sum = &Builtin{ Name: Var("sum"), NumArgs: 2, TargetPos: []int{1}, }
Sum takes an array of numbers and sums them.
var ToNumber = &Builtin{ Name: Var("to_number"), NumArgs: 2, TargetPos: []int{1}, }
ToNumber takes a string, bool, or number value and converts it to a number. Strings are converted to numbers using strconv.Atoi. Boolean false is converted to 0 and boolean true is converted to 1.
var Wildcard = &Term{Value: Var("_")}
Wildcard represents the wildcard variable as defined in the language.
var WildcardPrefix = "$"
WildcardPrefix is the special character that all wildcard variables are prefixed with when the statement they are contained in is parsed.
Functions ¶
func MustParseStatement ¶
func MustParseStatement(input string) interface{}
MustParseStatement returns exactly one statement. If an error occurs during parsing, panic.
func MustParseStatements ¶
func MustParseStatements(input string) []interface{}
MustParseStatements returns a slice of parsed statements. If an error occurs during parsing, panic.
func ParseReader ¶
ParseReader parses the data from r using filename as information in the error messages.
func ParseStatement ¶
ParseStatement returns exactly one statement. A statement might be a term, expression, rule, etc. Regardless, this function expects *exactly* one statement. If multiple statements are parsed, an error is returned.
func ParseStatements ¶
ParseStatements returns a slice of parsed statements. This is the default return value from the parser.
func RegisterBuiltin ¶
func RegisterBuiltin(b *Builtin)
RegisterBuiltin adds a new built-in function to the registry.
func Walk ¶
func Walk(v Visitor, x interface{})
Walk iterates the AST by calling the Visit function on the Visitor v for x before recursing.
func WalkClosures ¶
func WalkClosures(x interface{}, f func(interface{}) bool)
WalkClosures calls the function f on all closures under x. If the function f returns true, AST nodes under the last node will not be visited.
Types ¶
type Array ¶
type Array []*Term
Array represents an array as defined by the language. Arrays are similar to the same types as defined by JSON with the exception that they can contain Vars and References.
func (Array) Equal ¶
Equal returns true if the other Value is an Array and the elements of the other Array are equal to the elements of this Array. The elements are ordered.
type ArrayComprehension ¶
ArrayComprehension represents an array comprehension as defined in the language.
func (*ArrayComprehension) Equal ¶
func (ac *ArrayComprehension) Equal(other Value) bool
Equal returns true if this array comprehension is syntactically equal to another.
func (*ArrayComprehension) Hash ¶
func (ac *ArrayComprehension) Hash() int
Hash returns the hash code of the Value.
func (*ArrayComprehension) IsGround ¶
func (ac *ArrayComprehension) IsGround() bool
IsGround returns true if the Term and Body are ground.
func (*ArrayComprehension) String ¶
func (ac *ArrayComprehension) String() string
type Body ¶
type Body []*Expr
Body represents one or more expressios contained inside a rule.
func MustParseBody ¶
MustParseBody returns a parsed body. If an error occurs during parsing, panic.
func ParseBody ¶
ParseBody returns exactly one body. If multiple bodies are parsed, an error is returned.
func (Body) Equal ¶
Equal returns true if this Body is equal to the other Body. Two bodies are equal if consist of equal, ordered expressions.
func (Body) OutputVars ¶
OutputVars returns a VarSet containing the variables that would be bound by evaluating the body.
type Boolean ¶
type Boolean bool
Boolean represents a boolean value defined by JSON.
type Builtin ¶
Builtin represents a built-in function supported by OPA. Every built-in function is uniquely identified by a name.
func (*Builtin) GetPrintableName ¶
GetPrintableName returns a printable name for the builtin. Some built-ins have names that are used for infix operators but when printing we want to use something a bit more readable, e.g., "gte(a,b)" instead of ">=(a,b)".
func (*Builtin) IsTargetPos ¶
IsTargetPos returns true if a variable in the i-th position will be bound when the expression is evaluated.
type Compiler ¶
type Compiler struct { // Errors contains errors that occurred during the compilation process. // If there are one or more errors, the compilation process is considered // "failed". Errors []error // Modules contains the compiled modules. The compiled modules are the // output of the compilation process. If the compilation process failed, // there is no guarantee about the state of the modules. Modules map[string]*Module // Exports contains a mapping of package paths to variables. The variables // represent externally accessible symbols. For now the only type of // externally visible symbol is a rule. For example: // // package a.b.c // // import data.e.f // // p = true :- q[x] = 1 # "p" is an export // q[x] :- f.r[x], not f.m[x] # "q" is an export // // In this case, the mapping would be: // // { // a.b.c: [p, q] // } Exports *util.HashMap // Globals contains a mapping of modules to globally accessible variables // within each module. Each variable is mapped to the value which represents // the fully qualified name of the variable. For example: // // package a.b.c // // import data.e.f // import y as z // // p = true :- q[x] = 1 // q[x] :- f.r[x], not f.m[x] // // In this case, the mapping would be // // { // <modptr>: {q: data.a.b.c.q, f: data.e.f, p: data.a.b.c.p, z: y} // } Globals map[*Module]map[Var]Value // ModuleTree organizes the modules into a tree where each node is keyed // by an element in the module's package path. E.g., given modules containg // the following package directives: "a", "a.b", "a.c", and "a.b", the // resulting module tree would be: // // root // | // +--- data (no modules) // | // +--- a (1 module) // | // +--- b (2 modules) // | // +--- c (1 module) // ModuleTree *ModuleTreeNode // RuleGraph represents the rule dependencies. // An edge (u, v) is added to the graph if rule "u" depends on rule "v". // A rule depends on another rule if it refers to it. RuleGraph map[*Rule]map[*Rule]struct{} // contains filtered or unexported fields }
Compiler contains the state of a compilation process.
func (*Compiler) Compile ¶
Compile runs the compilation process on the input modules. The output of the compilation process can be obtained from the Errors or Modules attributes of the Compiler.
func (*Compiler) FlattenErrors ¶
FlattenErrors returns a single message that contains a flattened version of the compiler error messages. This must only be called when the compilation process has failed.
type DocKind ¶
type DocKind int
DocKind represents the collection of document types that can be produced by rules.
type Expr ¶
type Expr struct { Location *Location `json:"-"` Negated bool `json:",omitempty"` Terms interface{} }
Expr represents a single expression contained inside the body of a rule.
func NewBuiltinExpr ¶
NewBuiltinExpr creates a new Expr object with the supplied terms. The builtin operator must be the first term.
func (*Expr) Complement ¶
Complement returns a copy of this expression with the negation flag flipped.
func (*Expr) Equal ¶
Equal returns true if this Expr equals the other Expr. Two expressions are considered equal if both expressions are negated (or not), are built-ins (or not), and have the same ordered terms.
func (*Expr) IsEquality ¶
IsEquality returns true if this is an equality expression.
func (*Expr) OutputVars ¶
OutputVars returns a VarSet containing variables that would be bound by evaluating this expression.
func (*Expr) UnmarshalJSON ¶
UnmarshalJSON parses the byte array and stores the result in expr.
type GenericVisitor ¶
type GenericVisitor struct {
// contains filtered or unexported fields
}
GenericVisitor implements the Visitor interface to provide a utility to walk over AST nodes using a closure. If the closure returns true, the visitor will not walk over AST nodes under x.
func (*GenericVisitor) Visit ¶
func (vis *GenericVisitor) Visit(x interface{}) Visitor
Visit calls the function f on the GenericVisitor.
type Import ¶
Import represents a dependency on a document outside of the policy namespace. Imports are optional.
func (*Import) Equal ¶
Equal returns true if this Import has the same path and alias as the other Import.
type Location ¶
type Location struct { Text []byte // The original text fragment from the source. File string // The name of the source file (which may be empty). Row int // The line in the source. Col int // The column in the row. }
Location records a position in source code
func NewLocation ¶
NewLocation returns a new Location object.
type Module ¶
Module represents a collection of policies (defined by rules) within a namespace (defined by the package) and optional dependencies on external documents (defined by imports).
func MustParseModule ¶
MustParseModule returns a parsed module. If an error occurs during parsing, panic.
func ParseModule ¶
ParseModule returns a parsed Module object. For details on Module objects and their fields, see policy.go. Empty input will return nil, nil.
type ModuleTreeNode ¶
type ModuleTreeNode struct { Key string Modules []*Module Children map[string]*ModuleTreeNode }
ModuleTreeNode represents a node in the module tree. The module tree is keyed by the package path.
func NewModuleTree ¶
func NewModuleTree(mods map[string]*Module) *ModuleTreeNode
NewModuleTree returns a new ModuleTreeNode that represents the root of the module tree populated with the given modules.
func (*ModuleTreeNode) Size ¶
func (n *ModuleTreeNode) Size() int
Size returns the number of modules in the tree.
type Null ¶
type Null struct{}
Null represents the null value defined by JSON.
type Number ¶
type Number float64
Number represents a numeric value as defined by JSON.
type Object ¶
type Object [][2]*Term
Object represents an object as defined by the language. Objects are similar to the same types as defined by JSON with the exception that they can contain Vars and References.
func (Object) Diff ¶
Diff returns a new Object that contains only the key/value pairs that exist in obj.
func (Object) Equal ¶
Equal returns true if the other Value is an Object and the key/value pairs of the Other object are equal to the key/value pairs of this Object. The key/value pairs are ordered.
func (Object) Intersect ¶
Intersect returns a slice of term triplets that represent the intersection of keys between obj and other. For each intersecting key, the values from obj and other are included as the last two terms in the triplet (respectively).
func (Object) Merge ¶
Merge returns a new Object containing the non-overlapping keys of obj and other. If there are overlapping keys between obj and other, the values of associated with the keys are merged. Only objects can be merged with other objects. If the values cannot be merged, the second turn value will be false.
type Option ¶
type Option func(*parser) Option
Option is a function that can set an option on the parser. It returns the previous setting as an Option.
func Debug ¶
Debug creates an Option to set the debug flag to b. When set to true, debugging information is printed to stdout while parsing.
The default is false.
func Memoize ¶
Memoize creates an Option to set the memoize flag to b. When set to true, the parser will cache all results so each expression is evaluated only once. This guarantees linear parsing time even for pathological cases, at the expense of more memory and slower times for typical cases.
The default is false.
type Package ¶
Package represents the namespace of the documents produced by rules inside the module.
type QueryIterator ¶
QueryIterator defines the interface for querying AST documents with references.
type Ref ¶
type Ref []*Term
Ref represents a reference as defined by the language.
func MustParseRef ¶
MustParseRef returns a parsed reference. If an error occurs during parsing, panic.
func (Ref) Equal ¶
Equal returns true if the other Value is a Ref and the elements of the other Ref are equal to the this Ref.
func (Ref) OutputVars ¶
OutputVars returns a VarSet containing variables that would be bound by evaluating
this expression in isolation.
func (Ref) Underlying ¶
Underlying returns a slice of underlying Go values. If the slice is not ground, an error is returned.
type Rule ¶
type Rule struct { Location *Location `json:"-"` Name Var Key *Term `json:",omitempty"` Value *Term `json:",omitempty"` Body Body }
Rule represents a rule as defined in the language. Rules define the content of documents that represent policy decisions.
func MustParseRule ¶
MustParseRule returns a parsed rule. If an error occurs during parsing, panic.
func ParseConstantRule ¶
ParseConstantRule attempts to return a rule from a body. Equality expressions of the form <var> = <ground term> can be converted into rules of the form <var> = <ground term> :- true. This is a concise way of defining constants inside modules.
func ParseRule ¶
ParseRule returns exactly one rule. If multiple rules are parsed, an error is returned.
func (*Rule) Equal ¶
Equal returns true if this Rule has the same name, arguments, and body as the other Rule.
func (*Rule) HeadVars ¶
HeadVars returns map where keys represent all of the variables found in the head of the rule. The values of the map are ignored.
type Statement ¶
type Statement interface {
Loc() *Location
}
Statement represents a single statement within a module.
type String ¶
type String string
String represents a string value as defined by JSON.
type Term ¶
type Term struct { Value Value // the value of the Term as represented in Go Location *Location `json:"-"` // the location of the Term in the source }
Term is an argument to a function.
func ArrayComprehensionTerm ¶
ArrayComprehensionTerm creates a new Term with an ArrayComprehension value.
func BooleanTerm ¶
BooleanTerm creates a new Term with a Boolean value.
func Item ¶
Item is a helper for constructing an tuple containing two Terms representing a key/value pair in an Object.
func MustParseTerm ¶
MustParseTerm returns a parsed term. If an error occurs during parsing, panic.
func NumberTerm ¶
NumberTerm creates a new Term with a Number value.
func ObjectTerm ¶
ObjectTerm creates a new Term with an Object value.
func ParseTerm ¶
ParseTerm returns exactly one term. If multiple terms are parsed, an error is returned.
func StringTerm ¶
StringTerm creates a new Term with a String value.
func (*Term) Equal ¶
Equal returns true if this term equals the other term. Equality is defined for each kind of term.
func (*Term) MarshalJSON ¶
MarshalJSON returns the JSON encoding of the term. Specialized marshalling logic is required to include a type hint for Value.
func (*Term) UnmarshalJSON ¶
UnmarshalJSON parses the byte array and stores the result in term. Specialized unmarshalling is required to handle Value.
type Value ¶
type Value interface { // Equal returns true if this value equals the other value. Equal(other Value) bool // IsGround returns true if this value is not a variable or contains no variables. IsGround() bool // String returns a human readable string representation of the value. String() string // Returns hash code of the value. Hash() int }
Value declares the common interface for all Term values. Every kind of Term value in the language is represented as a type that implements this interface:
- Null, Boolean, Number, String - Object, Array - Variables - References - Array Comprehensions
func InterfaceToValue ¶
InterfaceToValue converts a native Go value x to a Value.
type Var ¶
type Var string
Var represents a variable as defined by the language.
type VarSet ¶
type VarSet map[Var]struct{}
VarSet represents a set of variables.
func Unify ¶
Unify returns a set of variables that will be unified when the equality expression defined by terms a and b is evaluated. The unifier assumes that variables in the VarSet safe are already unified.
type Visitor ¶
type Visitor interface {
Visit(v interface{}) (w Visitor)
}
Visitor defines the interface for iterating AST elements. The Visit function can return a Visitor w which will be used to visit the children of the AST element v. If the Visit function returns nil, the children will not be visited.