| package statefile |
| |
| import ( |
| "encoding/json" |
| "fmt" |
| |
| "github.com/hashicorp/terraform/internal/tfdiags" |
| ) |
| |
| func readStateV3(src []byte) (*File, tfdiags.Diagnostics) { |
| var diags tfdiags.Diagnostics |
| sV3 := &stateV3{} |
| err := json.Unmarshal(src, sV3) |
| if err != nil { |
| diags = diags.Append(jsonUnmarshalDiags(err)) |
| return nil, diags |
| } |
| |
| file, prepDiags := prepareStateV3(sV3) |
| diags = diags.Append(prepDiags) |
| return file, diags |
| } |
| |
| func prepareStateV3(sV3 *stateV3) (*File, tfdiags.Diagnostics) { |
| var diags tfdiags.Diagnostics |
| sV4, err := upgradeStateV3ToV4(sV3) |
| if err != nil { |
| diags = diags.Append(tfdiags.Sourceless( |
| tfdiags.Error, |
| upgradeFailed, |
| fmt.Sprintf("Error upgrading state file format from version 3 to version 4: %s.", err), |
| )) |
| return nil, diags |
| } |
| |
| file, prepDiags := prepareStateV4(sV4) |
| diags = diags.Append(prepDiags) |
| return file, diags |
| } |
| |
| // stateV2 is a representation of the legacy JSON state format version 3. |
| // |
| // It is only used to read version 3 JSON files prior to upgrading them to |
| // the current format. |
| // |
| // The differences between version 2 and version 3 are only in the data and |
| // not in the structure, so stateV3 actually shares the same structs as |
| // stateV2. Type stateV3 represents that the data within is formatted as |
| // expected by the V3 format, rather than the V2 format. |
| type stateV3 stateV2 |