Skip to content

Commit

Permalink
Handle eval errors on the client side
Browse files Browse the repository at this point in the history
  • Loading branch information
wata727 committed Feb 25, 2023
1 parent 78e0773 commit 316efba
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 4 deletions.
4 changes: 2 additions & 2 deletions plugin/fromproto/fromproto.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,9 +307,9 @@ func Error(err error) error {
case *proto.ErrorDetail:
switch t.Code {
case proto.ErrorCode_ERROR_CODE_UNKNOWN_VALUE:
return fmt.Errorf("%s%w", st.Message(), tflint.ErrUnknownValue)
return tflint.ErrUnknownValue
case proto.ErrorCode_ERROR_CODE_NULL_VALUE:
return fmt.Errorf("%s%w", st.Message(), tflint.ErrNullValue)
return tflint.ErrNullValue
case proto.ErrorCode_ERROR_CODE_UNEVALUABLE:
return fmt.Errorf("%s%w", st.Message(), tflint.ErrUnevaluable)
case proto.ErrorCode_ERROR_CODE_SENSITIVE:
Expand Down
22 changes: 22 additions & 0 deletions plugin/plugin2host/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/hashicorp/hcl/v2/hclsyntax"
hcljson "github.com/hashicorp/hcl/v2/json"
"github.com/terraform-linters/tflint-plugin-sdk/hclext"
"github.com/terraform-linters/tflint-plugin-sdk/logger"
"github.com/terraform-linters/tflint-plugin-sdk/plugin/fromproto"
"github.com/terraform-linters/tflint-plugin-sdk/plugin/proto"
"github.com/terraform-linters/tflint-plugin-sdk/plugin/toproto"
Expand Down Expand Up @@ -331,6 +332,27 @@ func (c *GRPCClient) EvaluateExpr(expr hcl.Expression, ret interface{}, opts *tf
return err
}

if ty == cty.DynamicPseudoType {
return gocty.FromCtyValue(val, ret)
}

// Returns an error if the value cannot be decoded to a Go value (e.g. unknown value, null).
// This allows the caller to handle the value by the errors package.
err = cty.Walk(val, func(path cty.Path, v cty.Value) (bool, error) {
if !v.IsKnown() {
logger.Debug(fmt.Sprintf("unknown value found in %s", expr.Range()))
return false, tflint.ErrUnknownValue
}
if v.IsNull() {
logger.Debug(fmt.Sprintf("null value found in %s", expr.Range()))
return false, tflint.ErrNullValue
}
return true, nil
})
if err != nil {
return err
}

return gocty.FromCtyValue(val, ret)
}

Expand Down
5 changes: 3 additions & 2 deletions tflint/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ import (
// inside the plugin system, so you usually don't have to worry about it.
var (
// ErrUnknownValue is an error when an unknown value is referenced
ErrUnknownValue = errors.New("")
ErrUnknownValue = errors.New("unknown value found")
// ErrNullValue is an error when null value is referenced
ErrNullValue = errors.New("")
ErrNullValue = errors.New("null value found")
// ErrUnevaluable is an error when a received expression has unevaluable references.
// Deprecated: This error is no longer returned since TFLint v0.41.
ErrUnevaluable = errors.New("")
// ErrSensitive is an error when a received expression contains a sensitive value.
ErrSensitive = errors.New("")
Expand Down

0 comments on commit 316efba

Please sign in to comment.