|
|
|
package routing
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// CadreFormat specifies how the shot data is formatted.
|
|
|
|
type CadreFormat int
|
|
|
|
|
|
|
|
const (
|
|
|
|
// CadreFormatANSI represents Terminal ANSI format.
|
|
|
|
CadreFormatANSI = iota
|
|
|
|
|
|
|
|
// CadreFormatHTML represents HTML.
|
|
|
|
CadreFormatHTML
|
|
|
|
|
|
|
|
// CadreFormatPNG represents PNG.
|
|
|
|
CadreFormatPNG
|
|
|
|
)
|
|
|
|
|
|
|
|
// Cadre contains result of a query execution.
|
|
|
|
type Cadre struct {
|
|
|
|
// Body contains the data of Cadre, formatted as Format.
|
|
|
|
Body []byte
|
|
|
|
|
|
|
|
// Format of the shot.
|
|
|
|
Format CadreFormat
|
|
|
|
|
|
|
|
// Expires contains the time of the Cadre expiration,
|
|
|
|
// or 0 if it does not expire.
|
|
|
|
Expires time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handler can handle queries and return views.
|
|
|
|
type Handler interface {
|
|
|
|
Response(*http.Request) *Cadre
|
|
|
|
}
|
|
|
|
|
|
|
|
type routeFunc func(*http.Request) bool
|
|
|
|
|
|
|
|
type route struct {
|
|
|
|
routeFunc
|
|
|
|
Handler
|
|
|
|
}
|
|
|
|
|
|
|
|
// Router keeps a routing table, and finds queries handlers, based on its rules.
|
|
|
|
type Router struct {
|
|
|
|
rt []route
|
|
|
|
}
|
|
|
|
|
|
|
|
// Route returns a query handler based on its content.
|
|
|
|
func (r *Router) Route(req *http.Request) Handler {
|
|
|
|
for _, re := range r.rt {
|
|
|
|
if re.routeFunc(req) {
|
|
|
|
return re.Handler
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// AddPath adds route for a static path.
|
|
|
|
func (r *Router) AddPath(path string, handler Handler) {
|
|
|
|
r.rt = append(r.rt, route{routePath(path), handler})
|
|
|
|
}
|
|
|
|
|
|
|
|
func routePath(path string) routeFunc {
|
|
|
|
return routeFunc(func(req *http.Request) bool {
|
|
|
|
return req.URL.Path == path
|
|
|
|
})
|
|
|
|
}
|