arg.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package sql3util
  2. import "strings"
  3. // NamedArg splits an named arg into a key and value,
  4. // around an equals sign.
  5. // Spaces are trimmed around both key and value.
  6. func NamedArg(arg string) (key, val string) {
  7. key, val, _ = strings.Cut(arg, "=")
  8. key = strings.TrimSpace(key)
  9. val = strings.TrimSpace(val)
  10. return
  11. }
  12. // Unquote unquotes a string.
  13. //
  14. // https://sqlite.org/lang_keywords.html
  15. func Unquote(val string) string {
  16. if len(val) < 2 {
  17. return val
  18. }
  19. fst := val[0]
  20. lst := val[len(val)-1]
  21. rst := val[1 : len(val)-1]
  22. if fst == '[' && lst == ']' {
  23. return rst
  24. }
  25. if fst != lst {
  26. return val
  27. }
  28. var old, new string
  29. switch fst {
  30. default:
  31. return val
  32. case '`':
  33. old, new = "``", "`"
  34. case '"':
  35. old, new = `""`, `"`
  36. case '\'':
  37. old, new = `''`, `'`
  38. }
  39. return strings.ReplaceAll(rst, old, new)
  40. }
  41. // ParseBool parses a boolean.
  42. //
  43. // https://sqlite.org/pragma.html#syntax
  44. func ParseBool(s string) (b, ok bool) {
  45. if len(s) == 0 {
  46. return false, false
  47. }
  48. if s[0] == '0' {
  49. return false, true
  50. }
  51. if '1' <= s[0] && s[0] <= '9' {
  52. return true, true
  53. }
  54. switch strings.ToLower(s) {
  55. case "true", "yes", "on":
  56. return true, true
  57. case "false", "no", "off":
  58. return false, true
  59. }
  60. return false, false
  61. }