lispjam-autumn-2024/error-mode.fnl
2024-10-29 19:44:41 -04:00

41 lines
1.3 KiB
Fennel

;; This mode has two purposes:
;; * display the stack trace that caused the error
;; * allow the user to decide whether to retry after reloading or quit
;; Since we can't know which module needs to be reloaded, we rely on the user
;; doing a ,reload foo in the repl.
(local state {:msg "" :traceback "" :old-mode :intro})
(local explanation "Press escape to quit.
Press space to return to the previous mode after reloading in the repl.")
(fn draw []
(love.graphics.clear 0.34 0.61 0.86)
(love.graphics.setColor 0.9 0.9 0.9)
(love.graphics.print explanation 15 10)
(love.graphics.print state.msg 10 60)
(love.graphics.print state.traceback 15 125))
(fn keypressed [key set-mode]
(match key
:escape (love.event.quit)
:space (set-mode state.old-mode)))
(fn color-msg [msg]
;; convert compiler's ansi escape codes to love2d-friendly codes
(case (msg:match "(.*)\027%[7m(.*)\027%[0m(.*)")
(pre selected post) [[1 1 1] pre
[1 0.2 0.2] selected
[1 1 1] post]
_ msg))
(fn activate [old-mode msg traceback]
(love.graphics.setNewFont 16) ; use a monospace font here if you have one
(print msg)
(print traceback)
(set state.old-mode old-mode)
(set state.msg (color-msg msg))
(set state.traceback traceback))
{: draw : keypressed : activate}