Skip to content

Commit

Permalink
fix(kernel): change file system hook signatures (#87)
Browse files Browse the repository at this point in the history
  • Loading branch information
plastikfan committed Jul 18, 2024
1 parent 0eb8d8f commit 907e713
Show file tree
Hide file tree
Showing 25 changed files with 353 additions and 126 deletions.
2 changes: 2 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
"lorax",
"Marillion",
"mattn",
"msys",
"musico",
"Mutables",
"nakedret",
Expand All @@ -70,6 +71,7 @@
"Persistables",
"pixa",
"prealloc",
"qsys",
"repotoken",
"rsys",
"samber",
Expand Down
20 changes: 13 additions & 7 deletions builders.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,22 @@ type buildArtefacts struct {
}

type Builders struct {
filesystem pref.FileSystemBuilder
options optionsBuilder
navigator kernel.NavigatorBuilder
plugins pluginsBuilder
extent extentBuilder
readerFS pref.ReadDirFileSystemBuilder
queryFS pref.QueryStatusFileSystemBuilder
options optionsBuilder
navigator kernel.NavigatorBuilder
plugins pluginsBuilder
extent extentBuilder
}

func (bs *Builders) buildAll() (*buildArtefacts, error) {
// BUILD FILE SYSTEM & EXTENT
//
ext := bs.extent.build(bs.filesystem.Build())
reader := bs.readerFS.Build()
ext := bs.extent.build(
reader,
bs.queryFS.Build(reader),
)

// BUILD OPTIONS
//
Expand All @@ -56,8 +61,9 @@ func (bs *Builders) buildAll() (*buildArtefacts, error) {
}

artefacts, navErr := bs.navigator.Build(o, &types.Resources{
FS: types.FileSystems{
FS: FileSystems{
N: ext.navFS(),
Q: ext.queryFS(),
R: ext.resFS(),
},
Supervisor: measure.New(),
Expand Down
4 changes: 2 additions & 2 deletions core/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import (
type (
// QueryStatusHook function signature that enables the default to be overridden.
// (By default, uses Lstat)
QueryStatusHook func(path string) (fs.FileInfo, error)
QueryStatusHook func(qsys fs.StatFS, path string) (fs.FileInfo, error)

// ReadDirectoryHook hook function to define implementation of how a directory's
// entries are read. A default implementation is preset, so does not have to be set
// by the client.
ReadDirectoryHook func(sys fs.FS, dirname string) ([]fs.DirEntry, error)
ReadDirectoryHook func(rsys fs.ReadDirFS, dirname string) ([]fs.DirEntry, error)

// SortHook hook function to define how directory entries are sorted. Does not
// have to be set explicitly. This will be set according to the IsCaseSensitive on
Expand Down
19 changes: 18 additions & 1 deletion director-resume_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package tv_test

import (
"context"
"io/fs"
"os"
"sync"
"testing/fstest"

"github.com/fortytw2/leaktest"
. "github.com/onsi/ginkgo/v2" //nolint:revive // ok
Expand All @@ -16,14 +19,22 @@ import (
)

var _ = Describe("Director(Resume)", Ordered, func() {
var restore pref.Option
var (
emptyFS fstest.MapFS
restore pref.Option
)

BeforeAll(func() {
restore = func(o *tv.Options) error {
o.Events.Begin.On(func(_ *cycle.BeginState) {})

return nil
}
emptyFS = fstest.MapFS{
".": &fstest.MapFile{
Mode: os.ModeDir,
},
}
})

BeforeEach(func() {
Expand All @@ -45,6 +56,12 @@ var _ = Describe("Director(Resume)", Ordered, func() {
Using: tv.Using{
Subscription: tv.SubscribeFiles,
Handler: noOpHandler,
GetReadDirFS: func() fs.ReadDirFS {
return emptyFS
},
GetQueryStatusFS: func(_ fs.FS) fs.StatFS {
return emptyFS
},
},
From: RestorePath,
Strategy: tv.ResumeStrategyFastward,
Expand Down
46 changes: 31 additions & 15 deletions director.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package tv

import (
"io/fs"
"os"

"github.com/snivilised/traverse/internal/hiber"
"github.com/snivilised/traverse/internal/kernel"
Expand Down Expand Up @@ -62,17 +61,26 @@ func Prime(using *pref.Using, settings ...pref.Option) *Builders {
// by a panic.
//
return &Builders{
filesystem: pref.FileSystem(func() fs.FS {
if using.GetFS != nil {
return using.GetFS()
readerFS: pref.CreateReadDirFS(func() fs.ReadDirFS {
if using.GetReadDirFS != nil {
return using.GetReadDirFS()
}
return os.DirFS(using.Root)

return NewNativeFS(using.Root)
}),
queryFS: pref.CreateQueryStatusFS(func(qsys fs.FS) fs.StatFS {
if using.GetQueryStatusFS != nil {
return using.GetQueryStatusFS(qsys)
}

return NewQueryStatusFS(qsys)
}),
extent: extension(func(fsys fs.FS) extent {
extent: extension(func(rsys fs.ReadDirFS, qsys fs.StatFS) extent {
return &primeExtent{
baseExtent: baseExtent{
fsys: fileSystems{
nas: fsys,
fileSys: fileSystems{
nas: rsys,
qus: qsys,
},
},
u: using,
Expand Down Expand Up @@ -109,17 +117,25 @@ func Resume(was *Was, settings ...pref.Option) *Builders {
// path was.
//
return &Builders{
filesystem: pref.FileSystem(func() fs.FS {
if was.Using.GetFS != nil {
return was.Using.GetFS()
readerFS: pref.CreateReadDirFS(func() fs.ReadDirFS {
if was.Using.GetReadDirFS != nil {
return was.Using.GetReadDirFS()
}
return os.DirFS(was.Using.Root)
return NewNativeFS(was.Root)
}),
queryFS: pref.CreateQueryStatusFS(func(fsys fs.FS) fs.StatFS {
if was.Using.GetQueryStatusFS != nil {
return was.Using.GetQueryStatusFS(fsys)
}

return NewQueryStatusFS(fsys)
}),
extent: extension(func(fsys fs.FS) extent {
extent: extension(func(rsys fs.ReadDirFS, qsys fs.StatFS) extent {
return &resumeExtent{
baseExtent: baseExtent{
fsys: fileSystems{
nas: fsys,
fileSys: fileSystems{
nas: rsys,
qus: qsys,
},
},
w: was,
Expand Down
20 changes: 13 additions & 7 deletions extent.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,32 @@ type extent interface {
was() *pref.Was
plugin(*kernel.Artefacts) types.Plugin
options(...pref.Option) (*pref.Options, error)
navFS() fs.FS
navFS() fs.ReadDirFS
queryFS() fs.StatFS
resFS() fs.FS
complete() bool
}

type fileSystems struct {
nas fs.FS
nas fs.ReadDirFS
qus fs.StatFS
res fs.FS
}

type baseExtent struct {
fsys fileSystems
fileSys fileSystems
}

func (ex *baseExtent) navFS() fs.FS {
return ex.fsys.nas
func (ex *baseExtent) navFS() fs.ReadDirFS {
return ex.fileSys.nas
}

func (ex *baseExtent) queryFS() fs.StatFS {
return ex.fileSys.qus
}

func (ex *baseExtent) resFS() fs.FS {
return ex.fsys.nas
return ex.fileSys.nas
}

type primeExtent struct {
Expand Down Expand Up @@ -88,7 +94,7 @@ func (ex *resumeExtent) plugin(artefacts *kernel.Artefacts) types.Plugin {
}

func (ex *resumeExtent) options(settings ...pref.Option) (*pref.Options, error) {
loaded, err := resume.Load(ex.fsys.res, ex.w.From, settings...)
loaded, err := resume.Load(ex.fileSys.res, ex.w.From, settings...)
ex.loaded = loaded

// get the resume point from the resume persistence file
Expand Down
8 changes: 4 additions & 4 deletions internal-traverse-defs.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ func (fn filesystem) build(path string) fs.FS {
}

type extentBuilder interface {
build(fsys fs.FS) extent
build(rsys fs.ReadDirFS, qsys fs.StatFS) extent
}

type extension func(fs.FS) extent
type extension func(rsys fs.ReadDirFS, qsys fs.StatFS) extent

func (fn extension) build(fsys fs.FS) extent {
return fn(fsys)
func (fn extension) build(rsys fs.ReadDirFS, qsys fs.StatFS) extent {
return fn(rsys, qsys)
}

// We need an entity that manages the decoration of the client handler. The
Expand Down
8 changes: 4 additions & 4 deletions internal/helpers/directory-tree-builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ const (
doWrite = true
)

func Musico(verbose bool, portions ...string) (fsys fstest.MapFS, root string) {
fsys = fstest.MapFS{
func Musico(verbose bool, portions ...string) (msys fstest.MapFS, root string) {
msys = fstest.MapFS{
".": &fstest.MapFile{
Mode: os.ModeDir,
},
}

return fsys, Provision(
NewMemWriteProvider(fsys, os.ReadFile, portions...),
return msys, Provision(
NewMemWriteProvider(msys, os.ReadFile, portions...),
verbose,
portions...,
)
Expand Down
2 changes: 1 addition & 1 deletion internal/kernel/navigation-fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"io/fs"
)

func read(sys fs.FS, o *readOptions, path string) (*Contents, error) {
func read(sys fs.ReadDirFS, o *readOptions, path string) (*Contents, error) {
entries, err := o.hooks.read.Invoke()(sys, path)

contents := newContents(
Expand Down
5 changes: 4 additions & 1 deletion internal/kernel/navigator-agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,10 @@ func (n *navigatorAgent) Ignite(ignition *types.Ignition) {
func (n *navigatorAgent) top(ctx context.Context,
ns *navigationStatic,
) (*types.KernelResult, error) {
info, ie := n.ao.hooks.QueryStatus.Invoke()(ns.root)
info, ie := n.ao.hooks.QueryStatus.Invoke()(
ns.mediator.resources.FS.Q, ns.root,
)

err := lo.TernaryF(ie != nil,
func() error {
return n.ao.defects.Fault.Accept(&pref.NavigationFault{
Expand Down
21 changes: 14 additions & 7 deletions internal/kernel/navigator-filter-custom_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,24 @@ var _ = Describe("NavigatorFilterCustom", Ordered, func() {
Root: path,
Subscription: entry.subscription,
Handler: callback,
GetFS: func() fs.FS {
GetReadDirFS: func() fs.ReadDirFS {
return vfs
},
GetQueryStatusFS: func(_ fs.FS) fs.StatFS {
return vfs
},
},
tv.WithFilterCustom(customFilter),
tv.WithHookQueryStatus(func(path string) (fs.FileInfo, error) {
return vfs.Stat(helpers.TrimRoot(path))
}),
tv.WithHookReadDirectory(func(_ fs.FS, dirname string) ([]fs.DirEntry, error) {
return vfs.ReadDir(helpers.TrimRoot(dirname))
}),
tv.WithHookQueryStatus(
func(qsys fs.StatFS, path string) (fs.FileInfo, error) {
return qsys.Stat(helpers.TrimRoot(path))
},
),
tv.WithHookReadDirectory(
func(rfs fs.ReadDirFS, dirname string) ([]fs.DirEntry, error) {
return rfs.ReadDir(helpers.TrimRoot(dirname))
},
),
)).Navigate(ctx)

assertFilteredNavigation(entry, testOptions{
Expand Down
29 changes: 19 additions & 10 deletions internal/kernel/navigator-filter-extended-glob_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,20 +78,29 @@ var _ = Describe("NavigatorFoldersWithFiles", Ordered, func() {
Root: path,
Subscription: entry.subscription,
Handler: callback,
GetFS: func() fs.FS {
GetReadDirFS: func() fs.ReadDirFS {
return vfs
},
GetQueryStatusFS: func(_ fs.FS) fs.StatFS {
return vfs
},
},
tv.WithFilter(filterDefs),
tv.WithFilterSink(func(reply pref.FilterReply) {
traverseFilter = reply.Node
}),
tv.WithHookQueryStatus(func(path string) (fs.FileInfo, error) {
return vfs.Stat(helpers.TrimRoot(path))
}),
tv.WithHookReadDirectory(func(_ fs.FS, dirname string) ([]fs.DirEntry, error) {
return vfs.ReadDir(helpers.TrimRoot(dirname))
}),
tv.WithFilterSink(
func(reply pref.FilterReply) {
traverseFilter = reply.Node
},
),
tv.WithHookQueryStatus(
func(qsys fs.StatFS, path string) (fs.FileInfo, error) {
return qsys.Stat(helpers.TrimRoot(path))
},
),
tv.WithHookReadDirectory(
func(rfs fs.ReadDirFS, dirname string) ([]fs.DirEntry, error) {
return rfs.ReadDir(helpers.TrimRoot(dirname))
},
),
)).Navigate(ctx)

assertFilteredNavigation(entry, testOptions{
Expand Down
Loading

0 comments on commit 907e713

Please sign in to comment.