diff --git a/internal/state/filesystem.go b/internal/state/filesystem.go index 63b2ed7..bb41d65 100644 --- a/internal/state/filesystem.go +++ b/internal/state/filesystem.go @@ -107,17 +107,12 @@ func (s *FilesystemStore) Paths(resolved report.Resolved) (ArtifactPaths, error) } func (s *FilesystemStore) SaveModuleSnapshot(_ context.Context, resolved report.Resolved, snapshot module.Snapshot) (string, error) { - paths, err := s.Paths(resolved) - if err != nil { - return "", err - } if err := snapshot.Validate(); err != nil { return "", err } - if err := fileutil.WriteJSONAtomic(paths.ModuleSnapshot, snapshot); err != nil { - return "", err - } - return paths.ModuleSnapshot, nil + return s.saveResolvedJSON(resolved, func(paths ArtifactPaths) string { + return paths.ModuleSnapshot + }, snapshot) } func (s *FilesystemStore) SaveDataPackage(_ context.Context, resolved report.Resolved, pkg promptinput.Package) (string, error) { @@ -132,72 +127,66 @@ func (s *FilesystemStore) SaveDataPackage(_ context.Context, resolved report.Res } func (s *FilesystemStore) SavePreflight(_ context.Context, resolved report.Resolved, artifact PreflightArtifact) (string, error) { - paths, err := s.Paths(resolved) - if err != nil { - return "", err - } - if err := fileutil.WriteJSONAtomic(paths.Preflight, artifact); err != nil { - return "", err - } - return paths.Preflight, nil + return s.saveResolvedJSON(resolved, func(paths ArtifactPaths) string { + return paths.Preflight + }, artifact) } func (s *FilesystemStore) SaveDistributorNotification(_ context.Context, resolved report.Resolved, artifact DistributorNotificationArtifact) (string, error) { - paths, err := s.Paths(resolved) - if err != nil { - return "", err - } if artifact.SchemaVersion == "" { artifact.SchemaVersion = DistributorNotificationSchemaVersion } - if err := fileutil.WriteJSONAtomic(paths.Notification, artifact); err != nil { - return "", err - } - return paths.Notification, nil + return s.saveResolvedJSON(resolved, func(paths ArtifactPaths) string { + return paths.Notification + }, artifact) } func (s *FilesystemStore) SaveGeneratedTextRaw(_ context.Context, resolved report.Resolved, data []byte) (string, error) { - paths, err := s.Paths(resolved) - if err != nil { - return "", err - } - if err := fileutil.WriteFileAtomic(paths.GeneratedTextRaw, data); err != nil { - return "", err - } - return paths.GeneratedTextRaw, nil + return s.saveResolvedBytes(resolved, func(paths ArtifactPaths) string { + return paths.GeneratedTextRaw + }, data) } func (s *FilesystemStore) SaveGeneratedTextResult(_ context.Context, resolved report.Resolved, value any) (string, error) { - paths, err := s.Paths(resolved) - if err != nil { - return "", err - } - if err := fileutil.WriteJSONAtomic(paths.GeneratedTextResult, value); err != nil { - return "", err - } - return paths.GeneratedTextResult, nil + return s.saveResolvedJSON(resolved, func(paths ArtifactPaths) string { + return paths.GeneratedTextResult + }, value) } func (s *FilesystemStore) SaveGeneratedText(_ context.Context, resolved report.Resolved, data []byte) (string, error) { - paths, err := s.Paths(resolved) - if err != nil { - return "", err - } - if err := fileutil.WriteFileAtomic(paths.GeneratedText, data); err != nil { - return "", err - } - return paths.GeneratedText, nil + return s.saveResolvedBytes(resolved, func(paths ArtifactPaths) string { + return paths.GeneratedText + }, data) } func (s *FilesystemStore) SaveRenderContext(_ context.Context, resolved report.Resolved, value any) (string, error) { + return s.saveResolvedJSON(resolved, func(paths ArtifactPaths) string { + return paths.RenderContext + }, value) +} + +func (s *FilesystemStore) saveResolvedJSON(resolved report.Resolved, selectPath func(ArtifactPaths) string, value any) (string, error) { paths, err := s.Paths(resolved) if err != nil { return "", err } - if err := fileutil.WriteJSONAtomic(paths.RenderContext, value); err != nil { + path := selectPath(paths) + if err := fileutil.WriteJSONAtomic(path, value); err != nil { return "", err } - return paths.RenderContext, nil + return path, nil +} + +func (s *FilesystemStore) saveResolvedBytes(resolved report.Resolved, selectPath func(ArtifactPaths) string, data []byte) (string, error) { + paths, err := s.Paths(resolved) + if err != nil { + return "", err + } + path := selectPath(paths) + if err := fileutil.WriteFileAtomic(path, data); err != nil { + return "", err + } + return path, nil } func (s *FilesystemStore) PrepareRenderedReport(_ context.Context, resolved report.Resolved) (string, error) {