Files
comicverse/editor/storage/local.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
}