func (ch *Chi) SetApp(app interface{}) error {
	var (
		eng *chi.Mux
		ok  bool
	)
	if eng, ok = app.(*chi.Mux); !ok {
		return errors.New("chi adapter SetApp: wrong parameter")
	}
	ch.app = eng
	return nil
}
SetApp implements the method Adapter.SetApp.
package chi
import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"regexp"
	"strings"
	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	cfg "github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/go-chi/chi"
)
type Chi struct {
	adapter.BaseAdapter
	ctx Context
	app *chi.Mux
}
func init() {
	engine.Register(new(Chi))
}
func (ch *Chi) User(ctx interface{}) (models.UserModel, bool) {
	return ch.GetUser(ctx, ch)
}
func (ch *Chi) Use(app interface{}, plugs []plugins.Plugin) error {
	return ch.GetUse(app, plugs, ch)
}
func (ch *Chi) Run() error                 { panic("not implement") }
func (ch *Chi) DisableLog()                { panic("not implement") }
func (ch *Chi) Static(prefix, path string) { panic("not implement") }
func (ch *Chi) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	ch.GetContent(ctx, getPanelFn, ch, btns, fn)
}
type HandlerFunc func(ctx Context) (types.Panel, error)
func Content(handler HandlerFunc) http.HandlerFunc {
	return func(writer http.ResponseWriter, request *http.Request) {
		ctx := Context{
			Request:  request,
			Response: writer,
		}
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(Context))
		})
	}
}