exprlib.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package exprhelpers
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "path"
  7. "regexp"
  8. "strconv"
  9. "strings"
  10. log "github.com/sirupsen/logrus"
  11. )
  12. var dataFile map[string][]string
  13. var dataFileRegex map[string][]*regexp.Regexp
  14. func Atof(x string) float64 {
  15. log.Debugf("debug atof %s", x)
  16. ret, err := strconv.ParseFloat(x, 64)
  17. if err != nil {
  18. log.Warningf("Atof : can't convert float '%s' : %v", x, err)
  19. }
  20. return ret
  21. }
  22. func StartsWith(s string, pref string) bool {
  23. return strings.HasPrefix(s, pref)
  24. }
  25. func EndsWith(s string, suff string) bool {
  26. return strings.HasSuffix(s, suff)
  27. }
  28. func GetExprEnv(ctx map[string]interface{}) map[string]interface{} {
  29. var ExprLib = map[string]interface{}{"Atof": Atof, "JsonExtract": JsonExtract, "JsonExtractLib": JsonExtractLib, "File": File, "RegexpInFile": RegexpInFile}
  30. for k, v := range ctx {
  31. ExprLib[k] = v
  32. }
  33. return ExprLib
  34. }
  35. func Init() error {
  36. log.Infof("Expr helper initiated")
  37. dataFile = make(map[string][]string)
  38. dataFileRegex = make(map[string][]*regexp.Regexp)
  39. return nil
  40. }
  41. func FileInit(fileFolder string, filename string, fileType string) error {
  42. filepath := path.Join(fileFolder, filename)
  43. file, err := os.Open(filepath)
  44. if err != nil {
  45. return err
  46. }
  47. defer file.Close()
  48. if _, ok := dataFile[filename]; !ok {
  49. dataFile[filename] = []string{}
  50. }
  51. if fileType == "" {
  52. fileType = "string"
  53. }
  54. scanner := bufio.NewScanner(file)
  55. for scanner.Scan() {
  56. switch fileType {
  57. case "regex", "regexp":
  58. dataFileRegex[filename] = append(dataFileRegex[filename], regexp.MustCompile(scanner.Text()))
  59. case "string":
  60. dataFile[filename] = append(dataFile[filename], scanner.Text())
  61. default:
  62. return fmt.Errorf("unknown data type '%s' for : '%s'", fileType, filename)
  63. }
  64. }
  65. if err := scanner.Err(); err != nil {
  66. return err
  67. }
  68. return nil
  69. }
  70. func File(filename string) []string {
  71. if _, ok := dataFile[filename]; ok {
  72. return dataFile[filename]
  73. }
  74. log.Errorf("file '%s' not found for expr library", filename)
  75. return []string{}
  76. }
  77. func RegexpInFile(data string, filename string) bool {
  78. if _, ok := dataFileRegex[filename]; ok {
  79. for _, re := range dataFileRegex[filename] {
  80. if re.Match([]byte(data)) {
  81. return true
  82. }
  83. }
  84. } else {
  85. log.Errorf("file '%s' not found for expr library", filename)
  86. }
  87. return false
  88. }