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