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}