- type Attribute
- type AttributeSchema
- type Attributes
- type Block
- type BlockHeaderSchema
- type Blocks
- type Body
- type BodyContent
- type BodySchema
- type Diagnostic
- type DiagnosticSeverity
- type DiagnosticWriter
- type Diagnostics
- type EvalContext
- type Expression
- type File
- type Pos
- type Range
- type Traversal
- type TraversalSplit
- func (t TraversalSplit) Join() Traversal
- func (t TraversalSplit) RootName() string
- func (t TraversalSplit) Traverse(ctx *EvalContext) (cty.Value, Diagnostics)
- func (t TraversalSplit) TraverseAbs(ctx *EvalContext) (cty.Value, Diagnostics)
- func (t TraversalSplit) TraverseRel(val cty.Value) (cty.Value, Diagnostics)
- type TraverseAttr
- type TraverseIndex
- type TraverseRoot
- type TraverseSplat
- type Traverser
This section is empty.
This section is empty.
This section is empty.
type Attribute struct {
Name string
Expr Expression
Range Range
NameRange Range
}
Attribute represents an attribute from within a body.
AttributeSchema represents the requirements for an attribute, and is used for matching attributes within bodies.
Attributes is a set of attributes keyed by their names.
type Block struct {
Type string
Labels []string
Body Body
DefRange Range
TypeRange Range
LabelRanges []Range
}
Block represents a nested block within a Body.
type BlockHeaderSchema struct {
}
BlockHeaderSchema represents the shape of a block header, and is used for matching blocks within bodies.
Blocks is a sequence of Block.
ByType transforms the receiving block sequence into a map from type name to block sequences of only that type.
type Body ¶
type Body interface {
Content(schema *BodySchema) (*BodyContent, Diagnostics)
PartialContent(schema *BodySchema) (*BodyContent, Body, Diagnostics)
JustAttributes() (Attributes, Diagnostics)
MissingItemRange() Range
}
Body is a container for attributes and blocks. It serves as the primary unit of heirarchical structure within configuration.
The content of a body cannot be meaningfully intepreted without a schema, so Body represents the raw body content and has methods that allow the content to be extracted in terms of a given schema.
func EmptyBody ¶
EmptyBody returns a body with no content. This body can be used as a placeholder when a body is required but no body content is available.
MergeBodies is like MergeFiles except it deals directly with bodies, rather than with entire files.
MergeFiles combines the given files to produce a single body that contains configuration from all of the given files.
The ordering of the given files decides the order in which contained elements will be returned. If any top-level attributes are defined with the same name across multiple files, a diagnostic will be produced from the Content and PartialContent methods describing this error in a user-friendly way.
type BodyContent ¶
type BodyContent struct {
Attributes Attributes
Blocks Blocks
MissingItemRange Range
}
BodyContent is the result of applying a BodySchema to a Body.
type BodySchema ¶
type BodySchema struct {
Attributes []AttributeSchema
Blocks []BlockHeaderSchema
}
BodySchema represents the desired shallow structure of a body.
type Diagnostic struct {
Severity DiagnosticSeverity
Summary string
Detail string
Subject *Range
Context *Range
}
Diagnostic represents information to be presented to a user about an error or anomoly in parsing or evaluating configuration.
error implementation, so that diagnostics can be returned via APIs that normally deal in vanilla Go errors.
This presents only minimal context about the error, for compatibility with usual expectations about how errors will present as strings.
type DiagnosticSeverity int
DiagnosticSeverity represents the severity of a diagnostic.
const ( DiagInvalid DiagnosticSeverity = iota DiagError DiagWarning )
type DiagnosticWriter interface {
WriteDiagnostic(*Diagnostic) error
WriteDiagnostics(Diagnostics) error
}
A DiagnosticWriter emits diagnostics somehow.
NewDiagnosticTextWriter creates a DiagnosticWriter that writes diagnostics to the given writer as formatted text.
It is designed to produce text appropriate to print in a monospaced font in a terminal of a particular width, or optionally with no width limit.
The given width may be zero to disable word-wrapping of the detail text and truncation of source code snippets.
If color is set to true, the output will include VT100 escape sequences to color-code the severity indicators. It is suggested to turn this off if the target writer is not a terminal.
type Diagnostics []*Diagnostic
Diagnostics is a list of Diagnostic instances.
Index is a helper function that performs the same operation as the index operator in the zcl expression language. That is, the result is the same as it would be for collection[key] in a configuration expression.
This is exported so that applications can perform indexing in a manner consistent with how the language does it, including handling of null and unknown values, etc.
Diagnostics are produced if the given combination of values is not valid. Therefore a pointer to a source range must be provided to use in diagnostics, though nil can be provided if the calling application is going to ignore the subject of the returned diagnostics anyway.
func (d Diagnostics) Append(diag *Diagnostic) Diagnostics
Append appends a new error to a Diagnostics and return the whole Diagnostics.
This is provided as a convenience for returning from a function that collects and then returns a set of diagnostics:
return nil, diags.Append(&zcl.Diagnostic{ ... })
Note that this modifies the array underlying the diagnostics slice, so must be used carefully within a single codepath. It is incorrect (and rude) to extend a diagnostics created by a different subsystem.
error implementation, so that sets of diagnostics can be returned via APIs that normally deal in vanilla Go errors.
func (d Diagnostics) Extend(diags Diagnostics) Diagnostics
Extend concatenates the given Diagnostics with the receiver and returns the whole new Diagnostics.
This is similar to Append but accepts multiple diagnostics to add. It has all the same caveats and constraints.
func (d Diagnostics) HasErrors() bool
HasErrors returns true if the receiver contains any diagnostics of severity DiagError.
An EvalContext provides the variables and functions that should be used to evaluate an expression.
func (ctx *EvalContext) NewChild() *EvalContext
NewChild returns a new EvalContext that is a child of the receiver.
func (ctx *EvalContext) Parent() *EvalContext
Parent returns the parent of the receiver, or nil if the receiver has no parent.
type Expression interface {
Value(ctx *EvalContext) (cty.Value, Diagnostics)
Variables() []Traversal
Range() Range
StartRange() Range
}
Expression is a literal value or an expression provided in the configuration, which can be evaluated within a scope to produce a value.
File is the top-level node that results from parsing a ZCL file.
Pos represents a single position in a source file, by addressing the start byte of a unicode character encoded in UTF-8.
Pos is generally used only in the context of a Range, which then defines which source file the position is within.
Range represents a span of characters between two positions in a source file.
This struct is usually used by value in types that represent AST nodes, but by pointer in types that refer to the positions of other objects, such as in diagnostics.
RangeBetween returns a new range that spans from the beginning of the start range to the end of the end range.
The result is meaningless if the two ranges do not belong to the same source file or if the end range appears before the start range.
ContainsOffset returns true if and only if the given byte offset is within the receiving Range.
Ptr returns a pointer to a copy of the receiver. This is a convenience when ranges in places where pointers are required, such as in Diagnostic, but the range in question is returned from a method. Go would otherwise not allow one to take the address of a function call.
String returns a compact string representation of the receiver. Callers should generally prefer to present a range more visually, e.g. via markers directly on the relevant portion of source code.
type Traversal []Traverser
A Traversal is a description of traversing through a value through a series of operations such as attribute lookup, index lookup, etc.
It is used to look up values in scopes, for example.
The traversal operations are implementations of interface Traverser. This is a closed set of implementations, so the interface cannot be implemented from outside this package.
A traversal can be absolute (its first value is a symbol name) or relative (starts from an existing value).
TraversalJoin appends a relative traversal to an absolute traversal to produce a new absolute traversal.
IsRelative returns true if the receiver is a relative traversal, or false otherwise.
RootName returns the root name for a absolute traversal. Will panic if called on a relative traversal.
func (t Traversal) SimpleSplit() TraversalSplit
SimpleSplit returns a TraversalSplit where the name lookup is the absolute part and the remainder is the relative part. Supported only for absolute traversals, and will panic if applied to a relative traversal.
This can be used by applications that have a relatively-simple variable namespace where only the top-level is directly populated in the scope, with everything else handled by relative lookups from those initial values.
TraverseAbs applies the receiving traversal to the given eval context, returning the resulting value. This is supported only for absolute traversals, and will panic if applied to a relative traversal.
TraverseRel applies the receiving traversal to the given value, returning the resulting value. This is supported only for relative traversals, and will panic if applied to an absolute traversal.
TraversalSplit represents a pair of traversals, the first of which is an absolute traversal and the second of which is relative to the first.
This is used by calling applications that only populate prefixes of the traversals in the scope, with Abs representing the part coming from the scope and Rel representing the remaining steps once that part is retrieved.
func (t TraversalSplit) Join() Traversal
Join concatenates together the Abs and Rel parts to produce a single absolute traversal.
RootName returns the root name for the absolute part of the split.
Traverse is a convenience function to apply TraverseAbs followed by TraverseRel.
TraverseAbs traverses from a scope to the value resulting from the absolute traversal.
TraverseRel traverses from a given value, assumed to be the result of TraverseAbs on some scope, to a final result for the entire split traversal.
TraverseAttr looks up an attribute in its initial value.
TraverseIndex applies the index operation to its initial value.
TraverseRoot looks up a root name in a scope. It is used as the first step of an absolute Traversal, and cannot itself be traversed directly.
TraversalStep on a TraverseName immediately panics, because absolute traversals cannot be directly traversed.
TraverseSplat applies the splat operation to its initial value.
A Traverser is a step within a Traversal.