forked from Silverfish/proton-bridge
73 lines
1.5 KiB
Go
73 lines
1.5 KiB
Go
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 }
|