filter.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package tinymq
  2. import (
  3. "reflect"
  4. "regexp"
  5. "runtime"
  6. "strings"
  7. )
  8. // 一些常用的过滤器
  9. // 匹配所有的频道
  10. func AllChannelFilter() FilterFunc {
  11. return func(conn *Line) (ok bool) {
  12. return true
  13. }
  14. }
  15. // 只匹配当前频道的过滤器
  16. func EqualChannelFilter(channel string) FilterFunc {
  17. return func(conn *Line) (ok bool) {
  18. return conn.channel == channel
  19. }
  20. }
  21. // 正则频道过滤器
  22. func RegChannelFilter(channel *regexp.Regexp) FilterFunc {
  23. return func(conn *Line) (ok bool) {
  24. return channel.MatchString(conn.channel)
  25. }
  26. }
  27. // 字符串频道过滤器
  28. func StrChannelFilter(channel string) FilterFunc {
  29. return func(conn *Line) (ok bool) {
  30. return strings.Contains(conn.channel, channel)
  31. }
  32. }
  33. // 字符串包含支名称的频道过滤器
  34. // 为了避免重复匹配,将频道值截断再匹配支名称
  35. func StrChannelSubFilter(channel string, substr string) FilterFunc {
  36. return func(conn *Line) (ok bool) {
  37. index := strings.Index(conn.channel, channel)
  38. if index < 0 {
  39. return false
  40. }
  41. return strings.Contains(conn.channel[index+len(channel):], substr)
  42. }
  43. }
  44. // 开始字符串频道过滤器
  45. func StrPrefixFilter(channel string) FilterFunc {
  46. return func(conn *Line) (ok bool) {
  47. return strings.HasPrefix(conn.channel, channel)
  48. }
  49. }
  50. // 开始字符串包含支名称的频道过滤器
  51. // 为了避免重复匹配,将频道值截断再匹配支名称
  52. func StrPrefixSubFilter(channel string, substr string) FilterFunc {
  53. return func(conn *Line) (ok bool) {
  54. return strings.HasPrefix(conn.channel, channel) && strings.Contains(conn.channel[len(channel):], substr)
  55. }
  56. }
  57. // 包括名称的频道过滤器
  58. func NamePrefixFilter(name string, channel string) FilterFunc {
  59. c := name + "@" + channel
  60. return func(conn *Line) (ok bool) {
  61. return strings.HasPrefix(conn.channel, c)
  62. }
  63. }
  64. // 连接过滤器
  65. func LineLinkFilter(line *Line) FilterFunc {
  66. return func(conn *Line) (ok bool) {
  67. return line == conn
  68. }
  69. }
  70. // GetFunctionName returns the fully qualified name of the function passed as an interface.
  71. func GetFunctionName(temp any) string {
  72. // Use reflect to get the pointer to the function's code.
  73. pc := reflect.ValueOf(temp).Pointer()
  74. // Use runtime.FuncForPC to get function details.
  75. f := runtime.FuncForPC(pc)
  76. if f == nil {
  77. return ""
  78. }
  79. return f.Name()
  80. }