| package plans |
| |
| import ( |
| "sync" |
| |
| "github.com/hashicorp/terraform/internal/addrs" |
| "github.com/zclconf/go-cty/cty" |
| ) |
| |
| // Conditions describes a set of results for condition blocks evaluated during |
| // the planning process. In normal operation, each result will either represent |
| // a passed check (Result is cty.True) or a deferred check (Result is |
| // cty.UnknownVal(cty.Bool)). Failing checks result in errors, except in |
| // refresh-only mode. |
| // |
| // The map key is a string representation of the check rule address, which is |
| // globally unique. Condition blocks can be evaluated multiple times during the |
| // planning operation, so we must be able to update an existing result value. |
| type Conditions map[string]*ConditionResult |
| |
| type ConditionResult struct { |
| Address addrs.Checkable |
| Result cty.Value |
| Type addrs.CheckType |
| ErrorMessage string |
| } |
| |
| func NewConditions() Conditions { |
| return make(Conditions) |
| } |
| |
| func (c Conditions) SyncWrapper() *ConditionsSync { |
| return &ConditionsSync{ |
| results: c, |
| } |
| } |
| |
| // ConditionsSync is a wrapper around a Conditions that provides a |
| // concurrency-safe interface to add or update a condition result value. |
| type ConditionsSync struct { |
| lock sync.Mutex |
| results Conditions |
| } |
| |
| func (cs *ConditionsSync) SetResult(addr addrs.Check, result *ConditionResult) { |
| if cs == nil { |
| panic("SetResult on nil Conditions") |
| } |
| cs.lock.Lock() |
| defer cs.lock.Unlock() |
| |
| cs.results[addr.String()] = result |
| } |