1414 defaultOption* : string
1515 defaultInput* : string
1616
17- macro genPrefs (prefDsl: untyped ) =
17+ PrefList * = OrderedTable [string , seq [Pref ]]
18+
19+ macro genPrefs * (prefDsl: untyped ) =
1820 var table = nnkTableConstr.newTree ()
1921 for category in prefDsl:
2022 table.add nnkExprColonExpr.newTree (newLit ($ category[0 ]))
@@ -41,7 +43,7 @@ macro genPrefs(prefDsl: untyped) =
4143
4244 let name = ident (" prefList" )
4345 result = quote do :
44- const `name`* = toOrderedTable (`table`)
46+ const `name`* : PrefList = toOrderedTable (`table`)
4547
4648genPrefs:
4749 Privacy :
@@ -101,46 +103,79 @@ iterator allPrefs*(): Pref =
101103 yield pref
102104
103105macro genDefaultPrefs * (): untyped =
104- result = nnkObjConstr.newTree (ident (" Prefs" ))
105-
106+ result = nnkStmtList.newTree ()
106107 for pref in allPrefs ():
107- let default =
108- case pref.kind
109- of checkbox: newLit (pref.defaultState)
110- of select: newLit (pref.defaultOption)
111- of input: newLit (pref.defaultInput)
112-
113- result .add nnkExprColonExpr.newTree (ident (pref.name), default)
108+ let
109+ ident = ident (pref.name)
110+ name = newLit (pref.name)
111+ default =
112+ case pref.kind
113+ of checkbox: newLit (pref.defaultState)
114+ of select: newLit (pref.defaultOption)
115+ of input: newLit (pref.defaultInput)
116+
117+ result .add quote do :
118+ defaultPrefs.`ident` = cfg.get (" Preferences" , `name`, `default`)
119+
120+ macro genCookiePrefs * (): untyped =
121+ result = nnkStmtList.newTree ()
122+ let cookies = ident (" cookies" )
123+ for pref in allPrefs ():
124+ let
125+ name = pref.name
126+ ident = ident (pref.name)
127+ kind = newLit (pref.kind)
128+ options = pref.options
129+
130+ result .add quote do :
131+ if `name` in `cookies`:
132+ let value = `cookies`[`name`]
133+ when `kind` == input or `name` == " theme" :
134+ result .`ident` = value
135+ elif `kind` == checkbox:
136+ result .`ident` = value == " on"
137+ else :
138+ if value in `options`: result .`ident` = value
114139
115140macro genUpdatePrefs * (): untyped =
116141 result = nnkStmtList.newTree ()
117-
142+ let req = ident (" request" )
143+ for pref in allPrefs ():
144+ let
145+ name = newLit (pref.name)
146+ kind = newLit (pref.kind)
147+ options = newLit (pref.options)
148+ default = nnkDotExpr.newTree (ident (" defaultPrefs" ), ident (pref.name))
149+
150+ result .add quote do :
151+ let val = @ `name`
152+ let isDefault =
153+ when `kind` == input or `name` == " theme" :
154+ if `default`.len != val.len: false
155+ else : val == `default`
156+ elif `kind` == checkbox:
157+ (val == " on" ) == `default`
158+ else :
159+ val notin `options` or val == `default`
160+
161+ if isDefault:
162+ savePref (`name`, " " , `req`, expire= true )
163+ else :
164+ savePref (`name`, val, `req`)
165+
166+ macro genResetPrefs * (): untyped =
167+ result = nnkStmtList.newTree ()
168+ let req = ident (" request" )
118169 for pref in allPrefs ():
119- let ident = ident (pref.name)
120- let value = nnkPrefix.newTree (ident (" @" ), newLit (pref.name))
121-
122- case pref.kind
123- of checkbox:
124- result .add quote do : prefs.`ident` = `value` == " on"
125- of input:
126- result .add quote do : prefs.`ident` = xmltree.escape (strip (`value`))
127- of select:
128- let name = pref.name
129- let options = pref.options
130- let default = pref.defaultOption
131- result .add quote do :
132- if `name` == " theme" : prefs.`ident` = `value`
133- elif `value` in `options`: prefs.`ident` = `value`
134- else : prefs.`ident` = `default`
135-
136- result .add quote do :
137- cache (prefs)
170+ let name = newLit (pref.name)
171+ result .add quote do :
172+ savePref (`name`, " " , `req`, expire= true )
138173
139174macro genPrefsType * (): untyped =
140175 let name = nnkPostfix.newTree (ident (" *" ), ident (" Prefs" ))
141176 result = quote do :
142177 type `name` = object
143- id * {. pk , ro .}: int
178+ discard
144179
145180 for pref in allPrefs ():
146181 result [0 ][2 ][2 ].add nnkIdentDefs.newTree (
0 commit comments