Documentation ¶
Overview ¶
Package tfdiags is a utility package for representing errors and warnings in a manner that allows us to produce good messages for the user.
"diag" is short for "diagnostics", and is meant as a general word for feedback to a user about potential or actual problems.
A design goal for this package is for it to be able to provide rich messaging where possible but to also be pragmatic about dealing with generic errors produced by system components that _can't_ provide such rich messaging. As a consequence, the main types in this package -- Diagnostics and Diagnostic -- are designed so that they can be "smuggled" over an error channel and then be unpacked at the other end, so that error diagnostics (at least) can transit through APIs that are not aware of this package.
Index ¶
- func FormatCtyPath(path cty.Path) string
- func FormatError(err error) string
- func GetAttribute(d Diagnostic) cty.Path
- type Description
- type Diagnostic
- func AttributeValue(severity Severity, summary, detail string, attrPath cty.Path) Diagnostic
- func Diag(sev Severity, summary, detail string) Diagnostic
- func FromError(err error) Diagnostic
- func SimpleWarning(msg string) Diagnostic
- func WholeContainingBody(severity Severity, summary, detail string) Diagnostic
- type Diagnostics
- type NonFatalError
- type Severity
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func FormatCtyPath ¶
FormatCtyPath is a helper function to produce a user-friendly string representation of a cty.Path. The result uses a syntax similar to the HCL expression language in the hope of it being familiar to users.
func FormatError ¶
FormatError is a helper function to produce a user-friendly string representation of certain special error types that we might want to include in diagnostic messages.
This currently has special behavior only for cty.PathError, where a non-empty path is rendered in a HCL-like syntax as context.
func GetAttribute ¶
func GetAttribute(d Diagnostic) cty.Path
GetAttribute extracts an attribute cty.Path from a diagnostic if it contains one. Normally this is not accessed directly, and instead the config body is added to the Diagnostic to create a more complete message for the user. In some cases however, we may want to know just the name of the attribute that generated the Diagnostic message. This returns a nil cty.Path if it does not exist in the Diagnostic.
Types ¶
type Description ¶
type Diagnostic ¶
type Diagnostic interface { Severity() Severity Description() Description }
func AttributeValue ¶
func AttributeValue(severity Severity, summary, detail string, attrPath cty.Path) Diagnostic
AttributeValue returns a diagnostic about an attribute value in an implied current configuration context. This should be returned only from functions whose interface specifies a clear configuration context that this will be resolved in.
The given path is relative to the implied configuration context. To describe a top-level attribute, it should be a single-element cty.Path with a cty.GetAttrStep. It's assumed that the path is returning into a structure that would be produced by our conventions in the configschema package; it may return unexpected results for structures that can't be represented by configschema.
Since mapping attribute paths back onto configuration is an imprecise operation (e.g. dynamic block generation may cause the same block to be evaluated multiple times) the diagnostic detail should include the attribute name and other context required to help the user understand what is being referenced in case the identified source range is not unique.
The returned attribute will not have source location information until context is applied to the containing diagnostics using diags.InConfigBody. After context is applied, the source location is the value assigned to the named attribute, or the containing body's "missing item range" if no value is present.
func Diag ¶
func Diag(sev Severity, summary, detail string) Diagnostic
func FromError ¶
func FromError(err error) Diagnostic
func SimpleWarning ¶
func SimpleWarning(msg string) Diagnostic
SimpleWarning constructs a simple (summary-only) warning diagnostic.
func WholeContainingBody ¶
func WholeContainingBody(severity Severity, summary, detail string) Diagnostic
WholeContainingBody returns a diagnostic about the body that is an implied current configuration context. This should be returned only from functions whose interface specifies a clear configuration context that this will be resolved in.
The returned attribute will not have source location information until context is applied to the containing diagnostics using diags.InConfigBody. After context is applied, the source location is currently the missing item range of the body. In future, this may change to some other suitable part of the containing body.
type Diagnostics ¶
type Diagnostics []Diagnostic
Diagnostics is a list of diagnostics. Diagnostics is intended to be used where a Go "error" might normally be used, allowing richer information to be conveyed (more context, support for warnings).
A nil Diagnostics is a valid, empty diagnostics list, thus allowing heap allocation to be avoided in the common case where there are no diagnostics to report at all.
func (Diagnostics) Err ¶
func (diags Diagnostics) Err() error
Err flattens a diagnostics list into a single Go error, or to nil if the diagnostics list does not include any error-level diagnostics.
This can be used to smuggle diagnostics through an API that deals in native errors, but unfortunately it will lose naked warnings (warnings that aren't accompanied by at least one error) since such APIs have no mechanism through which to report these.
return result, diags.Error()
func (Diagnostics) ErrWithWarnings ¶
func (diags Diagnostics) ErrWithWarnings() error
ErrWithWarnings is similar to Err except that it will also return a non-nil error if the receiver contains only warnings.
In the warnings-only situation, the result is guaranteed to be of dynamic type NonFatalError, allowing diagnostics-aware callers to type-assert and unwrap it, treating it as non-fatal.
This should be used only in contexts where the caller is able to recognize and handle NonFatalError. For normal callers that expect a lack of errors to be signaled by nil, use just Diagnostics.Err.
func (Diagnostics) ForRPC ¶
func (diags Diagnostics) ForRPC() Diagnostics
ForRPC returns a version of the receiver that has been simplified so that it is friendly to RPC protocols.
Currently this means that it can be serialized with encoding/gob and subsequently re-inflated. It may later grow to include other serialization formats.
Note that this loses information about the original objects used to construct the diagnostics, so e.g. the errwrap API will not work as expected on an error-wrapped Diagnostics that came from ForRPC.
func (Diagnostics) HasErrors ¶
func (diags Diagnostics) HasErrors() bool
HasErrors returns true if any of the diagnostics in the list have a severity of Error.
func (Diagnostics) NonFatalErr ¶
func (diags Diagnostics) NonFatalErr() error
NonFatalErr is similar to Err except that it always returns either nil (if there are no diagnostics at all) or NonFatalError.
This allows diagnostics to be returned over an error return channel while being explicit that the diagnostics should not halt processing.
This should be used only in contexts where the caller is able to recognize and handle NonFatalError. For normal callers that expect a lack of errors to be signaled by nil, use just Diagnostics.Err.
type NonFatalError ¶
type NonFatalError struct {
Diagnostics
}
NonFatalError is a special error type, returned by Diagnostics.ErrWithWarnings and Diagnostics.NonFatalErr, that indicates that the wrapped diagnostics should be treated as non-fatal. Callers can conditionally type-assert an error to this type in order to detect the non-fatal scenario and handle it in a different way.
func (NonFatalError) Error ¶
func (woe NonFatalError) Error() string