aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2025-11-17 08:03:25 +0100
committerDmitry Vyukov <dvyukov@google.com>2025-11-17 08:54:02 +0000
commitdc0208ace3f6b22d70ffc54092feec2ea83c7e20 (patch)
treeebddae7184cc0df43db3a363729863aac0cc5dc6
parentf7988ea4935e2627f33bc73cf235f2c1942dce76 (diff)
pkg/osutil: add Read/ParseJSON functions
-rw-r--r--pkg/osutil/osutil.go19
-rw-r--r--pkg/osutil/osutil_test.go21
2 files changed, 40 insertions, 0 deletions
diff --git a/pkg/osutil/osutil.go b/pkg/osutil/osutil.go
index 1379e8c23..936465ee7 100644
--- a/pkg/osutil/osutil.go
+++ b/pkg/osutil/osutil.go
@@ -268,6 +268,25 @@ func WriteJSON[T any](filename string, obj T) error {
return WriteFile(filename, jsonData)
}
+func ReadJSON[T any](filename string) (T, error) {
+ data, err := os.ReadFile(filename)
+ if err != nil {
+ var v T
+ return v, err
+ }
+ return ParseJSON[T](data)
+}
+
+func ParseJSON[T any](data []byte) (T, error) {
+ dec := json.NewDecoder(bytes.NewReader(data))
+ dec.DisallowUnknownFields()
+ var v T
+ if err := dec.Decode(&v); err != nil {
+ return v, fmt.Errorf("failed to unmarshal %T: %w", v, err)
+ }
+ return v, nil
+}
+
func WriteGzipStream(filename string, reader io.Reader) error {
f, err := os.Create(filename)
if err != nil {
diff --git a/pkg/osutil/osutil_test.go b/pkg/osutil/osutil_test.go
index 7d5913b4a..4d9bf4cf8 100644
--- a/pkg/osutil/osutil_test.go
+++ b/pkg/osutil/osutil_test.go
@@ -10,6 +10,8 @@ import (
"strings"
"testing"
"time"
+
+ "github.com/google/go-cmp/cmp"
)
func TestIsExist(t *testing.T) {
@@ -129,3 +131,22 @@ func TestMonotonicNano(t *testing.T) {
t.Fatalf("diff %v", diff)
}
}
+
+func TestReadWriteJSON(t *testing.T) {
+ type Test struct {
+ X int
+ Y string
+ }
+ test := Test{10, "foo"}
+ file := filepath.Join(t.TempDir(), "file")
+ if err := WriteJSON(file, test); err != nil {
+ t.Fatal(err)
+ }
+ test2, err := ReadJSON[Test](file)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if diff := cmp.Diff(test, test2); diff != "" {
+ t.Fatal(diff)
+ }
+}