GitRoot
craft your forge, build your project, grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package fs
6
7import (
8 "context"
9 "io/fs"
10
11 "github.com/go-git/go-billy/v5/memfs"
12 "gitroot.dev/server/logger"
13)
14
15type UpdatableFs interface {
16 fs.FS
17 Clear()
18 Update(fs fs.FS)
19}
20
21type updatableFs struct {
22 ctx context.Context
23 logger *logger.Logger
24 sub fs.FS
25}
26
27func NewUpdatableFs(ctx context.Context, sub fs.FS) *updatableFs {
28 return &updatableFs{
29 ctx: ctx,
30 logger: logger.NewLoggerCtx(logger.FS_LOGGER_NAME, ctx).NewSubLogger("updatableFs"),
31 sub: sub,
32 }
33}
34
35func (m *updatableFs) Clear() {
36 m.sub = ToFs(m.ctx, memfs.New())
37}
38
39func (m *updatableFs) Update(filesystem fs.FS) {
40 m.sub = filesystem
41}
42
43func (m *updatableFs) ReadFile(name string) ([]byte, error) {
44 m.logger.Debug("ReadFile", logger.NewLoggerPair("file", name))
45 return fs.ReadFile(m.sub, name)
46}
47
48func (m *updatableFs) ReadDir(name string) ([]fs.DirEntry, error) {
49 m.logger.Debug("ReadDir", logger.NewLoggerPair("file", name))
50 return fs.ReadDir(m.sub, name)
51}
52
53func (m *updatableFs) Stat(name string) (fs.FileInfo, error) {
54 m.logger.Debug("Stat", logger.NewLoggerPair("file", name))
55 return fs.Stat(m.sub, name)
56}
57
58func (m *updatableFs) Sub(dir string) (fs.FS, error) {
59 m.logger.Debug("Sub", logger.NewLoggerPair("dir", dir))
60 return fs.Sub(m.sub, dir)
61}
62
63func (m *updatableFs) Open(name string) (fs.File, error) {
64 m.logger.Debug("Open", logger.NewLoggerPair("name", name))
65 return m.sub.Open(name)
66}