From dc0208ace3f6b22d70ffc54092feec2ea83c7e20 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 17 Nov 2025 08:03:25 +0100 Subject: pkg/osutil: add Read/ParseJSON functions --- pkg/osutil/osutil.go | 19 +++++++++++++++++++ pkg/osutil/osutil_test.go | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+) 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) + } +} -- cgit mrf-deployment