2022-03-28 06:24:28 -05:00
|
|
|
package addrs
|
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
|
|
// Check is the address of a check rule within a checkable object.
|
|
|
|
//
|
|
|
|
// This represents the check rule globally within a configuration, and is used
|
|
|
|
// during graph evaluation to identify a condition result object to update with
|
|
|
|
// the result of check rule evaluation.
|
|
|
|
//
|
|
|
|
// The check address is not distinct from resource traversals, and check rule
|
|
|
|
// values are not intended to be available to the language, so the address is
|
|
|
|
// not Referenceable.
|
|
|
|
//
|
|
|
|
// Note also that the check address is only relevant within the scope of a run,
|
|
|
|
// as reordering check blocks between runs will result in their addresses
|
|
|
|
// changing.
|
|
|
|
type Check struct {
|
|
|
|
Container Checkable
|
|
|
|
Type CheckType
|
|
|
|
Index int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c Check) String() string {
|
|
|
|
container := c.Container.String()
|
|
|
|
switch c.Type {
|
|
|
|
case ResourcePrecondition:
|
|
|
|
return fmt.Sprintf("%s.preconditions[%d]", container, c.Index)
|
|
|
|
case ResourcePostcondition:
|
|
|
|
return fmt.Sprintf("%s.postconditions[%d]", container, c.Index)
|
|
|
|
case OutputPrecondition:
|
|
|
|
return fmt.Sprintf("%s.preconditions[%d]", container, c.Index)
|
|
|
|
default:
|
|
|
|
// This should not happen
|
|
|
|
return fmt.Sprintf("%s.conditions[%d]", container, c.Index)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Checkable is an interface implemented by all address types that can contain
|
|
|
|
// condition blocks.
|
|
|
|
type Checkable interface {
|
|
|
|
checkableSigil()
|
|
|
|
|
|
|
|
// Check returns the address of an individual check rule of a specified
|
|
|
|
// type and index within this checkable container.
|
|
|
|
Check(CheckType, int) Check
|
|
|
|
String() string
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
_ Checkable = AbsResourceInstance{}
|
|
|
|
_ Checkable = AbsOutputValue{}
|
|
|
|
)
|
|
|
|
|
|
|
|
type checkable struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c checkable) checkableSigil() {
|
|
|
|
}
|
|
|
|
|
|
|
|
// CheckType describes the category of check.
|
|
|
|
type CheckType int
|
|
|
|
|
2022-08-17 13:46:02 -05:00
|
|
|
//go:generate go run golang.org/x/tools/cmd/stringer -type=CheckType check.go
|
|
|
|
|
2022-03-28 06:24:28 -05:00
|
|
|
const (
|
|
|
|
InvalidCondition CheckType = 0
|
|
|
|
ResourcePrecondition CheckType = 1
|
|
|
|
ResourcePostcondition CheckType = 2
|
|
|
|
OutputPrecondition CheckType = 3
|
|
|
|
)
|
|
|
|
|
|
|
|
// Description returns a human-readable description of the check type. This is
|
|
|
|
// presented in the user interface through a diagnostic summary.
|
|
|
|
func (c CheckType) Description() string {
|
|
|
|
switch c {
|
|
|
|
case ResourcePrecondition:
|
|
|
|
return "Resource precondition"
|
|
|
|
case ResourcePostcondition:
|
|
|
|
return "Resource postcondition"
|
|
|
|
case OutputPrecondition:
|
|
|
|
return "Module output value precondition"
|
|
|
|
default:
|
|
|
|
// This should not happen
|
|
|
|
return "Condition"
|
|
|
|
}
|
|
|
|
}
|