github.com/hashicorp/terraform-plugin-sdk@v1.17.2/internal/states/statefile/diagnostics.go (about) 1 package statefile 2 3 import ( 4 "encoding/json" 5 "fmt" 6 7 "github.com/hashicorp/terraform-plugin-sdk/internal/tfdiags" 8 ) 9 10 const invalidFormat = "Invalid state file format" 11 12 // jsonUnmarshalDiags is a helper that translates errors returned from 13 // json.Unmarshal into hopefully-more-helpful diagnostics messages. 14 func jsonUnmarshalDiags(err error) tfdiags.Diagnostics { 15 var diags tfdiags.Diagnostics 16 if err == nil { 17 return diags 18 } 19 20 switch tErr := err.(type) { 21 case *json.SyntaxError: 22 // We've usually already successfully parsed a source file as JSON at 23 // least once before we'd use jsonUnmarshalDiags with it (to sniff 24 // the version number) so this particular error should not appear much 25 // in practice. 26 diags = diags.Append(tfdiags.Sourceless( 27 tfdiags.Error, 28 invalidFormat, 29 fmt.Sprintf("The state file could not be parsed as JSON: syntax error at byte offset %d.", tErr.Offset), 30 )) 31 case *json.UnmarshalTypeError: 32 // This is likely to be the most common area, describing a 33 // non-conformance between the file and the expected file format 34 // at a semantic level. 35 if tErr.Field != "" { 36 diags = diags.Append(tfdiags.Sourceless( 37 tfdiags.Error, 38 invalidFormat, 39 fmt.Sprintf("The state file field %q has invalid value %s", tErr.Field, tErr.Value), 40 )) 41 break 42 } else { 43 // Without a field name, we can't really say anything helpful. 44 diags = diags.Append(tfdiags.Sourceless( 45 tfdiags.Error, 46 invalidFormat, 47 "The state file does not conform to the expected JSON data structure.", 48 )) 49 } 50 default: 51 // Fallback for all other types of errors. This can happen only for 52 // custom UnmarshalJSON implementations, so should be encountered 53 // only rarely. 54 diags = diags.Append(tfdiags.Sourceless( 55 tfdiags.Error, 56 invalidFormat, 57 fmt.Sprintf("The state file does not conform to the expected JSON data structure: %s.", err.Error()), 58 )) 59 } 60 61 return diags 62 }