parent
c6b18b45b5
commit
e01a523ae3
8 changed files with 1286 additions and 183 deletions
@ -0,0 +1,40 @@ |
||||
package parser |
||||
|
||||
import "regexp" |
||||
|
||||
type HandlerFunc func(*Part) error |
||||
|
||||
type handler struct { |
||||
typeRegExp, dispRegExp string |
||||
fn HandlerFunc |
||||
} |
||||
|
||||
func (h *handler) matchPart(p *Part) bool { |
||||
return h.matchType(p) || h.matchDisp(p) |
||||
} |
||||
|
||||
func (h *handler) matchType(p *Part) bool { |
||||
if h.typeRegExp == "" { |
||||
return false |
||||
} |
||||
|
||||
t, _, err := p.Header.ContentType() |
||||
if err != nil { |
||||
t = "" |
||||
} |
||||
|
||||
return regexp.MustCompile(h.typeRegExp).MatchString(t) |
||||
} |
||||
|
||||
func (h *handler) matchDisp(p *Part) bool { |
||||
if h.dispRegExp == "" { |
||||
return false |
||||
} |
||||
|
||||
disp, _, err := p.Header.ContentDisposition() |
||||
if err != nil { |
||||
disp = "" |
||||
} |
||||
|
||||
return regexp.MustCompile(h.dispRegExp).MatchString(disp) |
||||
} |
||||
@ -1,72 +0,0 @@ |
||||
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 } |
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue