weather/internal/storage/file.go

56 lines
1.1 KiB
Go

package storage
import (
"context"
"go/weather/pkg/logger"
"io"
"io/fs"
"os"
"go.uber.org/zap"
)
//s3Storage classe used to store oi.Reader to s3
type fileStorage struct {
logger *logger.WeatherLogger
filename string
}
//NewFileStorage instanciate storage object
func NewFileStorage(log *logger.WeatherLogger, filename string) Storage {
s3 := fileStorage{
logger: log,
filename: filename,
}
return &s3
}
//Store send data to s3 bucket
func (ss *fileStorage) Store(ctx context.Context, content io.Reader) {
b, err := io.ReadAll(content)
ss.handleError(err)
err = AppendFile(ss.filename, append(b, "\n"...), fs.ModeAppend)
ss.handleError(err)
}
//AppendFile add line to an existing file
func AppendFile(filename string, data []byte, perm fs.FileMode) error {
f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, perm)
if err != nil {
return err
}
_, err = f.Write(data)
if err1 := f.Close(); err1 != nil && err == nil {
err = err1
}
return err
}
//handleError generic fatal error
func (ss *fileStorage) handleError(err error) {
if err != nil {
ss.logger.Fatal("Storage error", zap.Error(err))
}
}