prefs.nim 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import strutils, sequtils, macros
  2. import norm/sqlite
  3. import prefs_impl, types
  4. export genUpdatePrefs
  5. static:
  6. var pFields: seq[string]
  7. for id in getTypeImpl(Prefs)[2]:
  8. if $id[0] == "id": continue
  9. pFields.add $id[0]
  10. let pDefs = toSeq(allPrefs()).mapIt(it.name)
  11. let missing = pDefs.filterIt(it notin pFields)
  12. if missing.len > 0:
  13. raiseAssert("{$1} missing from the Prefs type" % missing.join(", "))
  14. template safeAddColumn(field: typedesc): untyped =
  15. try: field.addColumn
  16. except DbError: discard
  17. dbFromTypes("prefs.db", "", "", "", [Prefs])
  18. withDb:
  19. try:
  20. createTables()
  21. except DbError:
  22. discard
  23. Prefs.theme.safeAddColumn
  24. proc getDefaultPrefs(cfg: Config): Prefs =
  25. result = genDefaultPrefs()
  26. result.replaceTwitter = cfg.hostname
  27. result.theme = cfg.defaultTheme
  28. proc cache*(prefs: var Prefs) =
  29. withDb:
  30. try:
  31. doAssert prefs.id != 0
  32. discard Prefs.getOne("id = ?", prefs.id)
  33. prefs.update()
  34. except AssertionError, KeyError:
  35. prefs.insert()
  36. proc getPrefs*(id: string; cfg: Config): Prefs =
  37. if id.len == 0:
  38. return getDefaultPrefs(cfg)
  39. withDb:
  40. try:
  41. result.getOne("id = ?", id)
  42. except KeyError:
  43. result = getDefaultPrefs(cfg)
  44. proc resetPrefs*(prefs: var Prefs; cfg: Config) =
  45. var defPrefs = getDefaultPrefs(cfg)
  46. defPrefs.id = prefs.id
  47. cache(defPrefs)
  48. prefs = defPrefs