diff options
Diffstat (limited to 'lib/clod.lua')
-rw-r--r-- | lib/clod.lua | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/lib/clod.lua b/lib/clod.lua index 7058ab3..4cabbf0 100644 --- a/lib/clod.lua +++ b/lib/clod.lua @@ -40,6 +40,55 @@ function settings_mt:__index(subkey) end end +function settings_mt:__newindex(subkey, value) + local meta = metadata[self] + local confmeta = metadata[meta.conf] + local key = subkey + if meta.prefix then + key = meta.prefix .. "." .. subkey + end + if value == nil then + -- removing an entry... + if confmeta.settings[key] then + -- Need to remove *this* entry + local entry = confmeta.settings[key] + if entry == confmeta.entries then + -- First entry, move the head along + confmeta.entries = entry.next + end + if entry.prev then + entry.prev.next = entry.next + end + if entry.next then + entry.next.prev = entry.prev + end + -- Shuffle all lines from here on down away + entry = entry.next + while entry do + entry.lineno = entry.lineno - 1 + entry = entry.next + end + end + elseif confmeta.settings[key] then + -- Replacing extant entry + confmeta.settings[key].value = value + else + -- Inventing a new entry, we will put it at the end + local last = confmeta.entries + while last.next do + last = last.next + end + local new_entry = { + key = key, + value = value, + lineno = last.lineno + 1, + prev = last + } + last.next = new_entry + confmeta.settings[key] = new_entry + end +end + -- Helper routines function gen_settings(tab, prefix) local meta = metadata[tab] @@ -113,7 +162,7 @@ local function parse_config(conf, confname) -- A 'local' indexing, so combine with the key return gen_hook(("%s.%s"):format(prefix, key)) end - function parse_mt:__setindex(key, value) + function parse_mt:__newindex(key, value) -- This is the equivalent of 'foo = "bar"' instead of 'foo "bar"' return self[key](value) end |