Skip to content

Commit

Permalink
feat: save active state when panic occurs (#311)
Browse files Browse the repository at this point in the history
  • Loading branch information
plastikfan committed Nov 11, 2024
1 parent adceafc commit 84be826
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 17 deletions.
4 changes: 4 additions & 0 deletions core/core-defs.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ type (
Metrics Metrics
}

Recovery interface {
Save()
}

// SimpleHandler is a function that takes no parameters and can
// be used by any notification with this signature.
SimpleHandler func()
Expand Down
75 changes: 75 additions & 0 deletions internal/feat/resume/save_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package resume_test

import (
"context"

"github.com/fortytw2/leaktest"
. "github.com/onsi/ginkgo/v2" //nolint:revive // ok
. "github.com/onsi/gomega" //nolint:revive // ok
"github.com/snivilised/li18ngo"
"github.com/snivilised/nefilim/test/luna"
tv "github.com/snivilised/traverse"
"github.com/snivilised/traverse/core"
"github.com/snivilised/traverse/enums"
lab "github.com/snivilised/traverse/internal/laboratory"
"github.com/snivilised/traverse/internal/services"
"github.com/snivilised/traverse/locale"
"github.com/snivilised/traverse/pref"
"github.com/snivilised/traverse/test/hydra"
"github.com/snivilised/traverse/tfs"
)

var _ = Describe("Save", Ordered, func() {
var (
from string
fS *luna.MemFS
)

BeforeAll(func() {
Expect(li18ngo.Use(
func(o *li18ngo.UseOptions) {
o.From.Sources = li18ngo.TranslationFiles{
locale.SourceID: li18ngo.TranslationSource{Name: "traverse"},
}
},
)).To(Succeed())
})

BeforeEach(func() {
services.Reset()
fS = hydra.Nuxx(verbose, lab.Static.RetroWave)
from = lab.GetJSONPath()
})

Context("given: tbd...", func() {
It("🧪 should: tbd...", func(specCtx SpecContext) {
defer leaktest.Check(GinkgoT())()

ctx, cancel := context.WithCancel(specCtx)
defer cancel()
_ = from

path := lab.Static.RetroWave
result, err := tv.Walk().Configure().Extent(tv.Prime(
&pref.Using{
Subscription: enums.SubscribeDirectories,
Head: pref.Head{
Handler: lab.PanicAt(lab.Static.TeenageColor),
GetForest: func(_ string) *core.Forest {
return &core.Forest{
T: fS,
R: tfs.New(),
}
},
},
Tree: path,
},
tv.WithOnBegin(lab.Begin("🛡️")),
tv.WithOnEnd(lab.End("🏁")),
)).Navigate(ctx)

Expect(err).NotTo(Succeed())
Expect(result).NotTo(BeNil())
})
})
})
19 changes: 17 additions & 2 deletions internal/kernel/navigator-agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,21 @@ func (n *navigatorAgent) Ignite(ignition *enclave.Ignition) {

func (n *navigatorAgent) top(ctx context.Context,
ns *navigationStatic,
) (*enclave.KernelResult, error) {
) (result *enclave.KernelResult, err error) {
defer func() {
if data := recover(); data != nil {
n.ao.defects.Panic.Rescue(n, data)

err = errors.New("panic occurred")
result = ns.mediator.impl.Result(ctx, err)
}
}()

info, ie := n.ao.hooks.QueryStatus.Invoke()(
ns.mediator.resources.Forest.T, ns.tree,
)

err := lo.TernaryF(ie != nil,
err = lo.TernaryF(ie != nil,
func() error {
return n.ao.defects.Fault.Accept(&pref.NavigationFault{
Err: ie,
Expand Down Expand Up @@ -161,3 +170,9 @@ func (n *navigatorAgent) travel(ctx context.Context,

return continueTraversal, nil
}

func (n *navigatorAgent) Save() {
_ = &core.ActiveState{
//
}
}
19 changes: 19 additions & 0 deletions internal/laboratory/callbacks.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,22 @@ func DirectoriesCaseSensitiveCallback(first, second string) core.Client {
return nil
}
}

func PanicAt(at string) core.Client {
return func(servant core.Servant) error {
node := servant.Node()
depth := node.Extension.Depth
name := node.Extension.Name

GinkgoWriter.Printf(
"---> 👿 PANIC-AT//%v-CALLBACK: (depth:%v) '%v'\n",
name, depth, node.Path,
)

if name == at {
panic("foo bar")
}

return nil
}
}
14 changes: 8 additions & 6 deletions internal/laboratory/static.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ var (
}

Static = struct {
JSONFile string
JSONSubPath string
RetroWave string
JSONFile string
JSONSubPath string
RetroWave string
TeenageColor string
}{
JSONFile: "resume-state.json",
JSONSubPath: "json/unmarshal/resume-state.json",
RetroWave: "RETRO-WAVE",
JSONFile: "resume-state.json",
JSONSubPath: "json/unmarshal/resume-state.json",
RetroWave: "RETRO-WAVE",
TeenageColor: "Teenage Color",
}
)
4 changes: 2 additions & 2 deletions pref/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ func DefaultFaultHandler(fault *NavigationFault) error {
return fault.Err
}

func DefaultPanicHandler() {
// maybe this should invoke save
func DefaultPanicHandler(recovery core.Recovery, _ interface{}) {
recovery.Save()
}

func DefaultSkipHandler(*core.Node,
Expand Down
12 changes: 7 additions & 5 deletions pref/defects.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ type (

// PanicHandler
PanicHandler interface {
Rescue()
Rescue(r core.Recovery, data interface{})
}

Rescuer func()
Rescuer func(r core.Recovery, data interface{})

// FaultHandler is called to handle an error that occurs when Stating
// the tree directory. When an error occurs, traversal terminates
Expand Down Expand Up @@ -57,11 +57,13 @@ func (fn Accepter) Accept(fault *NavigationFault) error {
return fn(fault)
}

func (fn Rescuer) Rescue() {
fn()
func (fn Rescuer) Rescue(r core.Recovery, data interface{}) {
fn(r, data)
}

func (fn Asker) Ask(current *core.Node, contents core.DirectoryContents, err error) (enums.SkipTraversal, error) {
func (fn Asker) Ask(current *core.Node, contents core.DirectoryContents,
err error,
) (enums.SkipTraversal, error) {
return fn(current, contents, err)
}

Expand Down
4 changes: 2 additions & 2 deletions pref/pref-suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ type (
testSkipHandler struct{}
)

func (*testFaultHandler) Accept(*pref.NavigationFault) error { return nil }
func (*testPanicHandler) Rescue() {}
func (*testFaultHandler) Accept(*pref.NavigationFault) error { return nil }
func (*testPanicHandler) Rescue(_ core.Recovery, _ interface{}) {}
func (*testSkipHandler) Ask(*core.Node, core.DirectoryContents, error) (enums.SkipTraversal, error) {
return enums.SkipAllTraversal, nil
}

0 comments on commit 84be826

Please sign in to comment.