代码拉取完成,页面将自动刷新
package emqx
import (
mqtt "github.com/eclipse/paho.mqtt.golang"
"strings"
)
type HookHandler func(*Context)
type HandlerFunc func(*Context)
type Engine struct {
*Options
Topic string
TopicLen int
Wildcard bool
Shared bool
node *node
BeforeHook []HookHandler
AfterHook []HookHandler
}
func (o *Options) NewEngine(topic string, wildcard bool) (eng *Engine) {
eng = &Engine{
Options: o,
Topic: topic,
Wildcard: wildcard,
node: &node{
Options: o,
},
}
eng.checkTopic()
o.Engine = append(o.Engine, eng)
return
}
func (e *Engine) checkTopic() {
if e.Topic[0] == '/' {
e.Logger.Fatal("topic禁止以'/'符号开头")
}
if e.Topic[len(e.Topic)-1] == '/' {
e.Logger.Fatal("topic禁止以'/'符号开头")
}
e.TopicLen = len(strings.Split(e.Topic, "/"))
}
func (e *Engine) UseBefore(handler ...HookHandler) {
e.BeforeHook = handler
}
func (e *Engine) UseAfter(handler ...HookHandler) {
e.AfterHook = handler
}
// Register 注册方法到前缀树
func (e *Engine) Register(url string, handler HandlerFunc) {
if handler == nil {
e.Logger.Fatal("此topic未绑定方法")
}
e.checkUrl(url)
path := e.splitUrl(url)
for i, s := range path {
if s == "" {
path = append(path[:i], path[i+1:]...)
}
}
e.node = e.node.addRoute(path, handler)
}
// distribute 接收到topic后进行分发
func (e *Engine) distribute(client mqtt.Client, msg mqtt.Message) {
go e.handle(client, msg)
}
// handle 分发到具体的逻辑方法
func (e *Engine) handle(client mqtt.Client, msg mqtt.Message) {
path := strings.Split(msg.Topic(), "/")[e.TopicLen:]
logic := e.node.FindRoute(path)
if logic == nil {
e.Logger.Error("未找到对应的方法", msg.Topic())
return
}
context := NewContext(client, msg, path)
for _, hookHandler := range e.BeforeHook {
hookHandler(context)
}
logic.Handler(context)
for _, hookHandler := range e.AfterHook {
hookHandler(context)
}
}
func (e *Engine) splitUrl(url string) []string {
urlList := strings.Split(url, "/")
for i, s := range urlList {
if s == "" {
urlList = append(urlList[:i], urlList[i+1:]...)
}
}
return urlList
}
func (e *Engine) checkUrl(url string) {
if url == "" {
return
}
if url[0] != '/' {
e.Logger.Fatal("路由必须以'/'符号开头")
}
if url[len(url)-1] == '/' {
e.Logger.Fatal("路由禁止以'/'符号开头")
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。