refactor: return errors with stack traces, where appropriate
1 file changed, 41 insertions(+), 28 deletions(-)
changed files
M internal/storage/files/writer.go → internal/storage/files/writer.go
@@ -32,7 +32,7 @@ type Options struct { Compress bool } -func NewWriter(outputDirectory string, logger *log.Logger, opts *Options) (*Files, error) { +func NewWriter(outputDirectory string, logger *log.Logger, opts *Options) (*Files, errors.E) { return &Files{ outputDirectory: outputDirectory, options: opts,@@ -40,28 +40,33 @@ log: logger, }, nil } -func (f *Files) OpenRead(filename string) (io.ReadCloser, error) { - return os.Open(f.join(filename)) +func (f *Files) OpenRead(filename string) (io.ReadCloser, errors.E) { + file, err := os.Open(f.join(filename)) + if err != nil { + return nil, errors.WithStack(err) + } + + return file, nil } -func (f *Files) OpenWrite(filename string) (io.WriteCloser, error) { +func (f *Files) OpenWrite(filename string) (io.WriteCloser, errors.E) { return openFileWrite(f.join(filename)) } -func (f *Files) WritePost(post *content.Post, content *buffer.Buffer) error { +func (f *Files) WritePost(post *content.Post, content *buffer.Buffer) errors.E { fd, err := f.write(post.URL, content) if err != nil { return err } - err = fd.Close() - if err != nil { - return err + + if err := fd.Close(); err != nil { + return errors.WithStack(err) } if mf, isMultifile := fd.(*multifile.MultiFile); isMultifile { err = mf.Chtimes(post.Date) } else { - err = os.Chtimes(fd.Name(), post.Date, post.Date) + err = errors.WithStack(os.Chtimes(fd.Name(), post.Date, post.Date)) } if err != nil { return errors.WithMessage(err, "could not set file times")@@ -70,7 +75,7 @@ return nil } -func (f *Files) Write(pathname string, _ string, content *buffer.Buffer) error { +func (f *Files) Write(pathname string, _ string, content *buffer.Buffer) errors.E { fd, err := f.write(pathname, content) if err != nil { return err@@ -87,11 +92,11 @@ Encodings: map[string]*buffer.Buffer{}, } } -func (f *Files) WriteFile(file *storage.File, content *buffer.Buffer) error { +func (f *Files) WriteFile(file *storage.File, content *buffer.Buffer) errors.E { return f.Write(file.Path, file.Title, content) } -func (f *Files) write(pathname string, content *buffer.Buffer) (multifile.FileLike, error) { +func (f *Files) write(pathname string, content *buffer.Buffer) (multifile.FileLike, errors.E) { filename := pathNameToFileName(pathname) err := f.Mkdirp(filepath.Dir(filename)) if err != nil {@@ -103,33 +108,39 @@ if err != nil { return nil, errors.WithMessagef(err, "could not open output file") } - _, err = fd.Write(content.Bytes()) - if err != nil { + if _, err := fd.Write(content.Bytes()); err != nil { return nil, errors.WithMessage(err, "could not write output file") } return fd, nil } -func openFileWrite(filename string) (*os.File, error) { - return os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) +func openFileWrite(filename string) (*os.File, errors.E) { + f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return nil, errors.WithMessage(err, "could not open output file") + } + + return f, nil } -func openFileGz(filename string) (*multifile.CompressWriter, error) { +func openFileGz(filename string) (*multifile.CompressWriter, errors.E) { filenameGz := filename + ".gz" f, err := openFileWrite(filenameGz) if err != nil { return nil, err } - w, err := gzip.NewWriterLevel(f, gzipLevel) - if err != nil { - return nil, err + var w io.WriteCloser + var baseErr error + w, baseErr = gzip.NewWriterLevel(f, gzipLevel) + if baseErr != nil { + return nil, errors.WithStack(baseErr) } return multifile.NewCompressWriter(f, w), err } -func openFileBrotli(filename string) (*multifile.CompressWriter, error) { +func openFileBrotli(filename string) (*multifile.CompressWriter, errors.E) { filenameBrotli := filename + ".br" f, err := openFileWrite(filenameBrotli) if err != nil {@@ -139,21 +150,23 @@ return multifile.NewCompressWriter(f, brotli.NewWriterLevel(f, brotliLevel)), nil } -func openFileZstd(filename string) (*multifile.CompressWriter, error) { +func openFileZstd(filename string) (*multifile.CompressWriter, errors.E) { f, err := openFileWrite(filename + ".zstd") if err != nil { return nil, err } - w, err := zstd.NewWriter(f) - if err != nil { - return nil, err + var w io.WriteCloser + var baseErr error + w, baseErr = zstd.NewWriter(f) + if baseErr != nil { + return nil, errors.WithStack(baseErr) } return multifile.NewCompressWriter(f, w), nil } -func multiOpenFile(filename string) (*multifile.MultiFile, error) { +func multiOpenFile(filename string) (*multifile.MultiFile, errors.E) { r, err := openFileWrite(filename) if err != nil { return nil, err@@ -174,7 +187,7 @@ return multifile.NewMultiFile(r, gz, br, zst), nil } -func (f *Files) OpenFileAndVariants(filename string) (multifile.FileLike, error) { +func (f *Files) OpenFileAndVariants(filename string) (multifile.FileLike, errors.E) { if f.options.Compress { return multiOpenFile(f.join(filename)) }@@ -182,7 +195,7 @@ return openFileWrite(f.join(filename)) } -func (f *Files) Mkdirp(dir string) error { +func (f *Files) Mkdirp(dir string) errors.E { err := os.MkdirAll(f.join(dir), 0755) if err != nil { return errors.WithMessage(err, "could not create directory")