sq_selector.go 578 B

12345678910111213141516171819202122232425262728293031323334
  1. package ultraviolet
  2. import (
  3. "strconv"
  4. "strings"
  5. )
  6. type Selector func(expression any) *SQ
  7. func ExpressionToSelector(expression string) Selector {
  8. return func(value any) *SQ {
  9. // TODO: lock value mutex
  10. parts := strings.Split(expression, ".")
  11. result := NewSQ(value)
  12. for _, part := range parts {
  13. index, err := strconv.Atoi(part)
  14. if err == nil {
  15. result = result.Index(index)
  16. continue
  17. }
  18. resultField := result.Field(part)
  19. if resultField != nil {
  20. result = resultField
  21. continue
  22. }
  23. result = result.Key(part)
  24. }
  25. return result
  26. }
  27. }