package tinymq import ( "reflect" "regexp" "runtime" "strings" ) // 一些常用的过滤器 // 匹配所有的频道 func AllChannelFilter() FilterFunc { return func(conn *Line) (ok bool) { return true } } // 只匹配当前频道的过滤器 func EqualChannelFilter(channel string) FilterFunc { return func(conn *Line) (ok bool) { return conn.channel == channel } } // 正则频道过滤器 func RegChannelFilter(channel *regexp.Regexp) FilterFunc { return func(conn *Line) (ok bool) { return channel.MatchString(conn.channel) } } // 字符串频道过滤器 func StrChannelFilter(channel string) FilterFunc { return func(conn *Line) (ok bool) { return strings.Contains(conn.channel, channel) } } // 字符串包含支名称的频道过滤器 // 为了避免重复匹配,将频道值截断再匹配支名称 func StrChannelSubFilter(channel string, substr string) FilterFunc { return func(conn *Line) (ok bool) { index := strings.Index(conn.channel, channel) if index < 0 { return false } return strings.Contains(conn.channel[index+len(channel):], substr) } } // 开始字符串频道过滤器 func StrPrefixFilter(channel string) FilterFunc { return func(conn *Line) (ok bool) { return strings.HasPrefix(conn.channel, channel) } } // 开始字符串包含支名称的频道过滤器 // 为了避免重复匹配,将频道值截断再匹配支名称 func StrPrefixSubFilter(channel string, substr string) FilterFunc { return func(conn *Line) (ok bool) { return strings.HasPrefix(conn.channel, channel) && strings.Contains(conn.channel[len(channel):], substr) } } // 包括名称的频道过滤器 func NamePrefixFilter(name string, channel string) FilterFunc { c := name + "@" + channel return func(conn *Line) (ok bool) { return strings.HasPrefix(conn.channel, c) } } // 连接过滤器 func LineLinkFilter(line *Line) FilterFunc { return func(conn *Line) (ok bool) { return line == conn } } // GetFunctionName returns the fully qualified name of the function passed as an interface. func GetFunctionName(temp any) string { // Use reflect to get the pointer to the function's code. pc := reflect.ValueOf(temp).Pointer() // Use runtime.FuncForPC to get function details. f := runtime.FuncForPC(pc) if f == nil { return "" } return f.Name() }