Skip to content

Commit d50ccee

Browse files
committed
feat: add Lstat method to filesystem interface and implementations, with tests
1 parent 6f201d3 commit d50ccee

3 files changed

Lines changed: 41 additions & 44 deletions

File tree

engine.go

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"github.com/MontFerret/ferret/v2/pkg/bytecode"
99
"github.com/MontFerret/ferret/v2/pkg/bytecode/artifact"
1010
"github.com/MontFerret/ferret/v2/pkg/compiler"
11-
ferretnet "github.com/MontFerret/ferret/v2/pkg/net"
1211
"github.com/MontFerret/ferret/v2/pkg/source"
1312
"github.com/MontFerret/ferret/v2/pkg/vm"
1413
)
@@ -44,51 +43,22 @@ func New(setters ...Option) (*Engine, error) {
4443

4544
for _, m := range opts.modules {
4645
if err := m.Register(boot); err != nil {
47-
closeErr := boot.hooks.engine.runCloseHooks()
48-
49-
if ownsNetwork {
50-
ferretnet.CloseIdleNetworkConnections(boot.host.Network())
51-
}
52-
53-
if closeErr != nil {
54-
return nil, errors.Join(err, fmt.Errorf("close hooks: %w", closeErr))
55-
}
56-
57-
return nil, err
46+
return nil, closeEngineOnError(err, boot.hooks.engine, boot.host.Network(), ownsNetwork)
5847
}
5948
}
6049

6150
h, err := boot.host.Build()
6251
if err != nil {
63-
closeErr := boot.hooks.engine.runCloseHooks()
64-
65-
if ownsNetwork {
66-
ferretnet.CloseIdleNetworkConnections(boot.host.Network())
67-
}
68-
69-
if closeErr != nil {
70-
return nil, errors.Join(err, fmt.Errorf("close hooks: %w", closeErr))
71-
}
72-
73-
return nil, err
52+
return nil, closeEngineOnError(err, boot.hooks.engine, boot.host.Network(), ownsNetwork)
7453
}
7554

7655
hooks := boot.hooks.clone()
7756

7857
// Run init hooks after bootstrap is finalized and before returning the engine.
7958
if err := hooks.engine.runInitHooks(); err != nil {
8059
initErr := fmt.Errorf("init hooks: %w", err)
81-
closeErr := hooks.engine.runCloseHooks()
8260

83-
if ownsNetwork {
84-
ferretnet.CloseIdleNetworkConnections(h.network)
85-
}
86-
87-
if closeErr != nil {
88-
return nil, errors.Join(initErr, fmt.Errorf("close hooks: %w", closeErr))
89-
}
90-
91-
return nil, initErr
61+
return nil, closeEngineOnError(initErr, hooks.engine, h.network, ownsNetwork)
9262
}
9363

9464
return &Engine{
@@ -197,17 +167,7 @@ func (e *Engine) Run(ctx context.Context, src *source.Source, opts ...SessionOpt
197167

198168
// Close runs the engine close hooks and releases engine-scoped resources.
199169
func (e *Engine) Close() error {
200-
err := e.hooks.engine.runCloseHooks()
201-
202-
if e.ownsNetwork {
203-
ferretnet.CloseIdleNetworkConnections(e.host.network)
204-
}
205-
206-
if err != nil {
207-
return fmt.Errorf("close hooks: %w", err)
208-
}
209-
210-
return nil
170+
return closeEngine(e.hooks.engine, e.host.network, e.ownsNetwork)
211171
}
212172

213173
func (e *Engine) newPlan(prog *bytecode.Program) (*Plan, error) {

engine_helpers.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package ferret
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
7+
ferretnet "github.com/MontFerret/ferret/v2/pkg/net"
8+
)
9+
10+
func closeEngine(hooks *engineHookRegistry, network ferretnet.Network, ownsNetwork bool) error {
11+
closeErr := hooks.runCloseHooks()
12+
13+
if ownsNetwork {
14+
ferretnet.CloseIdleNetworkConnections(network)
15+
}
16+
17+
if closeErr != nil {
18+
return errors.Join(closeErr, fmt.Errorf("close hooks: %w", closeErr))
19+
}
20+
21+
return nil
22+
}
23+
24+
func closeEngineOnError(err error, hooks *engineHookRegistry, network ferretnet.Network, ownsNetwork bool) error {
25+
if err != nil {
26+
closeErr := closeEngine(hooks, network, ownsNetwork)
27+
28+
if closeErr != nil {
29+
return errors.Join(err, fmt.Errorf("close hooks: %w", closeErr))
30+
}
31+
}
32+
33+
return err
34+
}

plan_session.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ func newPlanSession[T any](
4545
plan.mu.RLock()
4646
if plan.closed {
4747
plan.mu.RUnlock()
48+
4849
return session, runtime.Error(runtime.ErrInvalidOperation, "plan is closed")
4950
}
5051

@@ -86,6 +87,7 @@ func newPlanSession[T any](
8687
options: options,
8788
logger: logging.NewFrom(h.logger, options.logger...),
8889
})
90+
8991
if err == nil {
9092
releaseOnReturn = false
9193
}
@@ -155,6 +157,7 @@ func buildDebugSession(dependencies planSessionDependencies) (*DebugSession, err
155157
Params: dependencies.program.Params,
156158
Format: dependencies.options.debugFormat,
157159
})
160+
158161
if err != nil {
159162
_ = execution.Close()
160163
return nil, err

0 commit comments

Comments
 (0)