Skip to content

Commit aaa2c18

Browse files
committed
refactor(logic): update panic_error handling for Prolog upgrade
1 parent 88cafb5 commit aaa2c18

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

x/logic/util/prolog.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package util
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"strings"
78

89
"github.com/axone-protocol/prolog/v2"
@@ -20,6 +21,11 @@ const (
2021
defaultEnvCap = uint64(50)
2122
)
2223

24+
var (
25+
errMessageVar = engine.NewVariable()
26+
errPanicError = engine.Atom("error").Apply(engine.AtomPanicError.Apply(errMessageVar))
27+
)
28+
2329
// QueryInterpreter interprets a query and returns the solutions up to the given limit.
2430
//
2531
//nolint:nestif,funlen
@@ -56,12 +62,14 @@ func QueryInterpreter(
5662
return nil, callErr
5763
}
5864

59-
var panicErr engine.PanicError
60-
if errors.As(callErr, &panicErr) && errors.Is(panicErr.OriginErr, engine.ErrMaxVariables) {
61-
return nil, errorsmod.Wrapf(types.LimitExceeded, panicErr.OriginErr.Error()) //nolint:govet
65+
var err engine.Exception
66+
if errors.As(callErr, &err) {
67+
if err, ok := isPanicError(err.Term(), env); ok {
68+
return nil, errorsmod.Wrapf(types.LimitExceeded, "%s", err)
69+
}
6270
}
6371

64-
if err = func() error {
72+
if err := func() error {
6573
defer func() {
6674
_ = recover()
6775
}()
@@ -137,3 +145,12 @@ func isBound(v engine.ParsedVariable, env *engine.Env) bool {
137145

138146
return !ok
139147
}
148+
149+
// isPanicError returns the panic error message if the given term is a panic_error.
150+
func isPanicError(term engine.Term, env *engine.Env) (string, bool) {
151+
if env, ok := env.Unify(term, errPanicError); ok {
152+
return fmt.Sprintf("%s", env.Resolve(errMessageVar)), true
153+
}
154+
155+
return "", false
156+
}

0 commit comments

Comments
 (0)