236 lines
7.3 KiB
Go
236 lines
7.3 KiB
Go
// Copyright 2024 The OPA Authors. All rights reserved.
|
|
// Use of this source code is governed by an Apache2
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package ast
|
|
|
|
import (
|
|
astJSON "github.com/open-policy-agent/opa/ast/json"
|
|
v1 "github.com/open-policy-agent/opa/v1/ast"
|
|
)
|
|
|
|
// DefaultRootDocument is the default root document.
|
|
//
|
|
// All package directives inside source files are implicitly prefixed with the
|
|
// DefaultRootDocument value.
|
|
var DefaultRootDocument = v1.DefaultRootDocument
|
|
|
|
// InputRootDocument names the document containing query arguments.
|
|
var InputRootDocument = v1.InputRootDocument
|
|
|
|
// SchemaRootDocument names the document containing external data schemas.
|
|
var SchemaRootDocument = v1.SchemaRootDocument
|
|
|
|
// FunctionArgRootDocument names the document containing function arguments.
|
|
// It's only for internal usage, for referencing function arguments between
|
|
// the index and topdown.
|
|
var FunctionArgRootDocument = v1.FunctionArgRootDocument
|
|
|
|
// FutureRootDocument names the document containing new, to-become-default,
|
|
// features.
|
|
var FutureRootDocument = v1.FutureRootDocument
|
|
|
|
// RegoRootDocument names the document containing new, to-become-default,
|
|
// features in a future versioned release.
|
|
var RegoRootDocument = v1.RegoRootDocument
|
|
|
|
// RootDocumentNames contains the names of top-level documents that can be
|
|
// referred to in modules and queries.
|
|
//
|
|
// Note, the schema document is not currently implemented in the evaluator so it
|
|
// is not registered as a root document name (yet).
|
|
var RootDocumentNames = v1.RootDocumentNames
|
|
|
|
// DefaultRootRef is a reference to the root of the default document.
|
|
//
|
|
// All refs to data in the policy engine's storage layer are prefixed with this ref.
|
|
var DefaultRootRef = v1.DefaultRootRef
|
|
|
|
// InputRootRef is a reference to the root of the input document.
|
|
//
|
|
// All refs to query arguments are prefixed with this ref.
|
|
var InputRootRef = v1.InputRootRef
|
|
|
|
// SchemaRootRef is a reference to the root of the schema document.
|
|
//
|
|
// All refs to schema documents are prefixed with this ref. Note, the schema
|
|
// document is not currently implemented in the evaluator so it is not
|
|
// registered as a root document ref (yet).
|
|
var SchemaRootRef = v1.SchemaRootRef
|
|
|
|
// RootDocumentRefs contains the prefixes of top-level documents that all
|
|
// non-local references start with.
|
|
var RootDocumentRefs = v1.RootDocumentRefs
|
|
|
|
// SystemDocumentKey is the name of the top-level key that identifies the system
|
|
// document.
|
|
const SystemDocumentKey = v1.SystemDocumentKey
|
|
|
|
// ReservedVars is the set of names that refer to implicitly ground vars.
|
|
var ReservedVars = v1.ReservedVars
|
|
|
|
// Wildcard represents the wildcard variable as defined in the language.
|
|
var Wildcard = v1.Wildcard
|
|
|
|
// WildcardPrefix is the special character that all wildcard variables are
|
|
// prefixed with when the statement they are contained in is parsed.
|
|
const WildcardPrefix = v1.WildcardPrefix
|
|
|
|
// Keywords contains strings that map to language keywords.
|
|
var Keywords = v1.Keywords
|
|
|
|
var KeywordsV0 = v1.KeywordsV0
|
|
|
|
var KeywordsV1 = v1.KeywordsV1
|
|
|
|
func KeywordsForRegoVersion(v RegoVersion) []string {
|
|
return v1.KeywordsForRegoVersion(v)
|
|
}
|
|
|
|
// IsKeyword returns true if s is a language keyword.
|
|
func IsKeyword(s string) bool {
|
|
return v1.IsKeyword(s)
|
|
}
|
|
|
|
func IsInKeywords(s string, keywords []string) bool {
|
|
return v1.IsInKeywords(s, keywords)
|
|
}
|
|
|
|
// IsKeywordInRegoVersion returns true if s is a language keyword.
|
|
func IsKeywordInRegoVersion(s string, regoVersion RegoVersion) bool {
|
|
return v1.IsKeywordInRegoVersion(s, regoVersion)
|
|
}
|
|
|
|
type (
|
|
// Node represents a node in an AST. Nodes may be statements in a policy module
|
|
// or elements of an ad-hoc query, expression, etc.
|
|
Node = v1.Node
|
|
|
|
// Statement represents a single statement in a policy module.
|
|
Statement = v1.Statement
|
|
)
|
|
|
|
type (
|
|
|
|
// 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).
|
|
Module = v1.Module
|
|
|
|
// Comment contains the raw text from the comment in the definition.
|
|
Comment = v1.Comment
|
|
|
|
// Package represents the namespace of the documents produced
|
|
// by rules inside the module.
|
|
Package = v1.Package
|
|
|
|
// Import represents a dependency on a document outside of the policy
|
|
// namespace. Imports are optional.
|
|
Import = v1.Import
|
|
|
|
// Rule represents a rule as defined in the language. Rules define the
|
|
// content of documents that represent policy decisions.
|
|
Rule = v1.Rule
|
|
|
|
// Head represents the head of a rule.
|
|
Head = v1.Head
|
|
|
|
// Args represents zero or more arguments to a rule.
|
|
Args = v1.Args
|
|
|
|
// Body represents one or more expressions contained inside a rule or user
|
|
// function.
|
|
Body = v1.Body
|
|
|
|
// Expr represents a single expression contained inside the body of a rule.
|
|
Expr = v1.Expr
|
|
|
|
// SomeDecl represents a variable declaration statement. The symbols are variables.
|
|
SomeDecl = v1.SomeDecl
|
|
|
|
Every = v1.Every
|
|
|
|
// With represents a modifier on an expression.
|
|
With = v1.With
|
|
)
|
|
|
|
// NewComment returns a new Comment object.
|
|
func NewComment(text []byte) *Comment {
|
|
return v1.NewComment(text)
|
|
}
|
|
|
|
// IsValidImportPath returns an error indicating if the import path is invalid.
|
|
// If the import path is valid, err is nil.
|
|
func IsValidImportPath(v Value) (err error) {
|
|
return v1.IsValidImportPath(v)
|
|
}
|
|
|
|
// NewHead returns a new Head object. If args are provided, the first will be
|
|
// used for the key and the second will be used for the value.
|
|
func NewHead(name Var, args ...*Term) *Head {
|
|
return v1.NewHead(name, args...)
|
|
}
|
|
|
|
// VarHead creates a head object, initializes its Name, Location, and Options,
|
|
// and returns the new head.
|
|
func VarHead(name Var, location *Location, jsonOpts *astJSON.Options) *Head {
|
|
return v1.VarHead(name, location, jsonOpts)
|
|
}
|
|
|
|
// RefHead returns a new Head object with the passed Ref. If args are provided,
|
|
// the first will be used for the value.
|
|
func RefHead(ref Ref, args ...*Term) *Head {
|
|
return v1.RefHead(ref, args...)
|
|
}
|
|
|
|
// DocKind represents the collection of document types that can be produced by rules.
|
|
type DocKind = v1.DocKind
|
|
|
|
const (
|
|
// CompleteDoc represents a document that is completely defined by the rule.
|
|
CompleteDoc = v1.CompleteDoc
|
|
|
|
// PartialSetDoc represents a set document that is partially defined by the rule.
|
|
PartialSetDoc = v1.PartialSetDoc
|
|
|
|
// PartialObjectDoc represents an object document that is partially defined by the rule.
|
|
PartialObjectDoc = v1.PartialObjectDoc
|
|
)
|
|
|
|
type RuleKind = v1.RuleKind
|
|
|
|
const (
|
|
SingleValue = v1.SingleValue
|
|
MultiValue = v1.MultiValue
|
|
)
|
|
|
|
// NewBody returns a new Body containing the given expressions. The indices of
|
|
// the immediate expressions will be reset.
|
|
func NewBody(exprs ...*Expr) Body {
|
|
return v1.NewBody(exprs...)
|
|
}
|
|
|
|
// NewExpr returns a new Expr object.
|
|
func NewExpr(terms interface{}) *Expr {
|
|
return v1.NewExpr(terms)
|
|
}
|
|
|
|
// NewBuiltinExpr creates a new Expr object with the supplied terms.
|
|
// The builtin operator must be the first term.
|
|
func NewBuiltinExpr(terms ...*Term) *Expr {
|
|
return v1.NewBuiltinExpr(terms...)
|
|
}
|
|
|
|
// Copy returns a deep copy of the AST node x. If x is not an AST node, x is returned unmodified.
|
|
func Copy(x interface{}) interface{} {
|
|
return v1.Copy(x)
|
|
}
|
|
|
|
// RuleSet represents a collection of rules that produce a virtual document.
|
|
type RuleSet = v1.RuleSet
|
|
|
|
// NewRuleSet returns a new RuleSet containing the given rules.
|
|
func NewRuleSet(rules ...*Rule) RuleSet {
|
|
return v1.NewRuleSet(rules...)
|
|
}
|