feat: enter and exit handlers

This commit is contained in:
James Houlahan
2020-07-29 13:59:52 +02:00
parent 8bd74c5edc
commit a7da66ccbc
6 changed files with 269 additions and 90 deletions

View File

@ -0,0 +1,72 @@
package parser
type PartHandlerFunc func(*Part) error
type DispHandlerFunc func(*Part, PartHandlerFunc) error
type PartHandler struct {
enter, exit PartHandlerFunc
}
func NewPartHandler() *PartHandler {
return &PartHandler{
enter: partNoop,
exit: partNoop,
}
}
func (h *PartHandler) OnEnter(fn PartHandlerFunc) *PartHandler {
h.enter = fn
return h
}
func (h *PartHandler) OnExit(fn PartHandlerFunc) *PartHandler {
h.exit = fn
return h
}
func (h *PartHandler) handleEnter(_ *Walker, p *Part) error {
return h.enter(p)
}
func (h *PartHandler) handleExit(_ *Walker, p *Part) error {
return h.exit(p)
}
type DispHandler struct {
enter, exit DispHandlerFunc
}
func NewDispHandler() *DispHandler {
return &DispHandler{
enter: dispNoop,
exit: dispNoop,
}
}
func (h *DispHandler) OnEnter(fn DispHandlerFunc) *DispHandler {
h.enter = fn
return h
}
func (h *DispHandler) OnExit(fn DispHandlerFunc) *DispHandler {
h.exit = fn
return h
}
func (h *DispHandler) handleEnter(w *Walker, p *Part) error {
// NOTE: This is hacky -- is there a better solution?
return h.enter(p, func(p *Part) error {
return w.getTypeHandler(p).handleEnter(w, p)
})
}
func (h *DispHandler) handleExit(w *Walker, p *Part) error {
// NOTE: This is hacky -- is there a better solution?
return h.exit(p, func(p *Part) error {
return w.getTypeHandler(p).handleExit(w, p)
})
}
func partNoop(*Part) error { return nil }
func dispNoop(*Part, PartHandlerFunc) error { return nil }