99 lines
1.9 KiB
Go
99 lines
1.9 KiB
Go
package storage
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"io/fs"
|
|
"log/slog"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
func Newlocal(
|
|
root *os.Root,
|
|
logger *slog.Logger,
|
|
) Storage {
|
|
return &local{
|
|
log: logger,
|
|
root: root,
|
|
}
|
|
}
|
|
|
|
type local struct {
|
|
log *slog.Logger
|
|
root *os.Root
|
|
}
|
|
|
|
var _ Storage = (*local)(nil)
|
|
|
|
func (files *local) Exists(p string) bool {
|
|
if _, err := files.root.Stat(p); err != nil {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (files *local) Open(p string) (fs.File, error) {
|
|
log := files.log.With(
|
|
slog.String("path", p),
|
|
slog.String("root", files.root.Name()))
|
|
|
|
log.Debug("Opening file")
|
|
defer log.Debug("File opened")
|
|
|
|
f, err := files.root.Open(p)
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
return nil, ErrNotExists
|
|
} else if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return f, nil
|
|
}
|
|
|
|
func (files *local) Write(p string, d []byte) (int, error) {
|
|
log := files.log.With(
|
|
slog.String("path", p),
|
|
slog.String("root", files.root.Name()))
|
|
|
|
log.Debug("Writing file")
|
|
defer log.Debug("File wrote")
|
|
|
|
if err := files.root.MkdirAll(path.Dir(p), os.ModePerm); err != nil {
|
|
return 0, fmt.Errorf("file.local: failed to create parent directories %q: %w", path.Dir(p), err)
|
|
}
|
|
|
|
err := files.root.WriteFile(p, d, os.ModePerm)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("file.local: failed to write file %q: %w", p, err)
|
|
}
|
|
|
|
return len(d), nil
|
|
}
|
|
|
|
func (files *local) WriteFrom(p string, r io.Reader) (int64, error) {
|
|
log := files.log.With(
|
|
slog.String("path", p),
|
|
slog.String("root", files.root.Name()))
|
|
|
|
log.Debug("Writing file")
|
|
defer log.Debug("File wrote")
|
|
|
|
if err := files.root.MkdirAll(path.Dir(p), os.ModePerm); err != nil {
|
|
return 0, fmt.Errorf("file.local: failed to create parent directories %q: %w", path.Dir(p), err)
|
|
}
|
|
|
|
f, err := files.root.Create(p)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("file.local: failed to create file %q: %w", p, err)
|
|
}
|
|
|
|
n, err := f.ReadFrom(r)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("file.local: failed to write file %q: %w", p, err)
|
|
}
|
|
|
|
return n, nil
|
|
}
|