| 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. |
| //go:generate go run golang.org/x/tools/cmd/stringer -type=CheckType check.go |
| type CheckType int |
| |
| 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" |
| } |
| } |