Skip to content

Commit d596f38

Browse files
committed
chore: extract sops_file logic
1 parent 194f247 commit d596f38

File tree

3 files changed

+73
-76
lines changed

3 files changed

+73
-76
lines changed

sops/data.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package sops
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"path"
7+
8+
"github.com/hashicorp/terraform-plugin-framework/types"
9+
)
10+
11+
type summaryError struct {
12+
Summary string
13+
Err error
14+
}
15+
16+
func (e summaryError) Error() string {
17+
return fmt.Sprintf("%s: %s", e.Summary, e.Err.Error())
18+
}
19+
20+
func newSummaryError(summary string, err error) summaryError {
21+
return summaryError{
22+
Summary: summary,
23+
Err: err,
24+
}
25+
}
26+
27+
func getFileData(sourceFile types.String, inputType types.String) (data map[string]string, raw string, err error) {
28+
sourceFileValue := sourceFile.ValueString()
29+
content, err := ioutil.ReadFile(sourceFileValue)
30+
if err != nil {
31+
return nil, "", newSummaryError("Error reading file", err)
32+
}
33+
34+
var format string
35+
if !inputType.IsNull() {
36+
format = inputType.ValueString()
37+
} else {
38+
switch ext := path.Ext(sourceFileValue); ext {
39+
case ".json":
40+
format = "json"
41+
case ".yaml", ".yml":
42+
format = "yaml"
43+
case ".env":
44+
format = "dotenv"
45+
case ".ini":
46+
format = "ini"
47+
default:
48+
return nil, "", newSummaryError("Unknown file type", fmt.Errorf("Don't know how to decode file with extension %s, set input_type as appropriate", ext))
49+
}
50+
}
51+
52+
if err := validateInputType(format); err != nil {
53+
return nil, "", newSummaryError("Invalid input type", err)
54+
}
55+
56+
data, raw, err = readData(content, format)
57+
if err != nil {
58+
return nil, "", newSummaryError("Error reading data", err)
59+
}
60+
return data, raw, nil
61+
}

sops/data_sops_file.go

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ package sops
22

33
import (
44
"context"
5-
"fmt"
6-
"io/ioutil"
7-
"path"
85

96
"github.com/hashicorp/terraform-plugin-framework/datasource"
107
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
@@ -71,48 +68,19 @@ func (d *fileDataSource) Read(ctx context.Context, req datasource.ReadRequest, r
7168
return
7269
}
7370

74-
sourceFile := config.SourceFile.ValueString()
75-
content, err := ioutil.ReadFile(sourceFile)
71+
data, raw, err := getFileData(config.SourceFile, config.InputType)
7672
if err != nil {
77-
resp.Diagnostics.AddError("Error reading file", err.Error())
78-
return
79-
}
80-
81-
var format string
82-
if !config.InputType.IsNull() {
83-
format = config.InputType.ValueString()
84-
} else {
85-
switch ext := path.Ext(sourceFile); ext {
86-
case ".json":
87-
format = "json"
88-
case ".yaml", ".yml":
89-
format = "yaml"
90-
case ".env":
91-
format = "dotenv"
92-
case ".ini":
93-
format = "ini"
94-
default:
95-
resp.Diagnostics.AddError(
96-
"Unknown file type",
97-
fmt.Sprintf("Don't know how to decode file with extension %s, set input_type as appropriate", ext),
98-
)
99-
return
73+
if detailedErr, ok := err.(summaryError); ok {
74+
resp.Diagnostics.AddError(detailedErr.Summary, detailedErr.Err.Error())
75+
} else {
76+
resp.Diagnostics.AddError("Failed to decrypt file", err.Error())
10077
}
101-
}
102-
103-
if err := validateInputType(format); err != nil {
104-
resp.Diagnostics.AddError("Invalid input type", err.Error())
105-
return
106-
}
107-
108-
data, raw, err := readData(content, format)
109-
if err != nil {
110-
resp.Diagnostics.AddError("Error reading data", err.Error())
11178
return
11279
}
11380

11481
m, mapDiags := types.MapValueFrom(ctx, types.StringType, data)
11582
resp.Diagnostics.Append(mapDiags...)
83+
11684
if resp.Diagnostics.HasError() {
11785
return
11886
}

sops/ephemeral_sops_file.go

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ package sops
22

33
import (
44
"context"
5-
"fmt"
6-
"io/ioutil"
7-
"path"
85

96
"github.com/hashicorp/terraform-plugin-framework/ephemeral"
107
"github.com/hashicorp/terraform-plugin-framework/ephemeral/schema"
@@ -66,48 +63,19 @@ func (d *fileEphemeralResource) Open(ctx context.Context, req ephemeral.OpenRequ
6663
return
6764
}
6865

69-
sourceFile := config.SourceFile.ValueString()
70-
content, err := ioutil.ReadFile(sourceFile)
66+
data, raw, err := getFileData(config.SourceFile, config.InputType)
7167
if err != nil {
72-
resp.Diagnostics.AddError("Error reading file", err.Error())
73-
return
74-
}
75-
76-
var format string
77-
if !config.InputType.IsNull() {
78-
format = config.InputType.ValueString()
79-
} else {
80-
switch ext := path.Ext(sourceFile); ext {
81-
case ".json":
82-
format = "json"
83-
case ".yaml", ".yml":
84-
format = "yaml"
85-
case ".env":
86-
format = "dotenv"
87-
case ".ini":
88-
format = "ini"
89-
default:
90-
resp.Diagnostics.AddError(
91-
"Unknown file type",
92-
fmt.Sprintf("Don't know how to decode file with extension %s, set input_type as appropriate", ext),
93-
)
94-
return
68+
if detailedErr, ok := err.(summaryError); ok {
69+
resp.Diagnostics.AddError(detailedErr.Summary, detailedErr.Err.Error())
70+
} else {
71+
resp.Diagnostics.AddError("Failed to decrypt file", err.Error())
9572
}
96-
}
97-
98-
if err := validateInputType(format); err != nil {
99-
resp.Diagnostics.AddError("Invalid input type", err.Error())
100-
return
101-
}
102-
103-
data, raw, err := readData(content, format)
104-
if err != nil {
105-
resp.Diagnostics.AddError("Error reading data", err.Error())
10673
return
10774
}
10875

10976
m, mapDiags := types.MapValueFrom(ctx, types.StringType, data)
11077
resp.Diagnostics.Append(mapDiags...)
78+
11179
if resp.Diagnostics.HasError() {
11280
return
11381
}

0 commit comments

Comments
 (0)