-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsettings.moon
More file actions
110 lines (94 loc) · 2.51 KB
/
settings.moon
File metadata and controls
110 lines (94 loc) · 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import Settings from require "models"
totype = (str) ->
if value = tonumber str
return value
if str == "true"
return true
if str == "false"
return false
if str == "nil"
return nil
return str
cache = {}
get = (name, create=true) ->
setting = cache[name]
unless setting
setting = Settings\find :name
if (not setting) and create
setting = Settings\create :name
cache[name] = setting
if setting
return setting
else
return nil, "failed to load '#{name}' setting"
local settings
settings = {
get: (name, skip_index) ->
unless name
return settings.load!
unless skip_index -- for metamethods to not loop endlessly
return settings[name] if settings[name]
setting, err = get name
if setting
value = totype setting.value
settings[name] = value
return value
else
return nil, err
set: (name, value) ->
unless name
return settings.save!
setting, err = get name
if setting
settings[name] = value
return setting\update value: tostring value
else
return nil, err
save: (name) ->
if name
setting, err = get name
if setting
return setting\update value: tostring settings[name]
else
return nil, err
else
for name, value in pairs settings
switch name
when "get", "set", "save", "load", "delete"
nil
else
t = type value
if t == "function" or t == "table"
return nil, "cannot save '#{name}' setting, type '#{t}' not supported"
else
unless cache[name]
cache[name] = Settings\find :name
unless cache[name]
cache[name] = Settings\create :name
for name, setting in pairs cache
_, err = setting\update value: tostring settings[name]
return nil, err if err
return true
load: (name) ->
return settings.get name if name
all_settings = Settings\select "WHERE true"
for setting in *all_settings
name = setting.name
cache[name] = setting
settings[name] = totype setting.value
return settings
delete: (name) ->
if setting = get name, false
if setting\delete!
cache[name] = nil
settings[name] = nil
else
return nil, "failed to delete '#{name}' setting"
return true
}
return setmetatable settings, {
__call: (t, name) ->
return settings.get name, true
__index: (t, name) ->
return settings.get name, true
}