aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/quarrel/persistent.lua
blob: 2b15c89e356a1019e45ad0186f2328b90fbe4908 (plain)
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
local gdebug = require "gears.debug"
local qfs = require "quarrel.fs"
local qjson = require "quarrel.json"

awesome.register_xproperty("is_restart", "boolean")

---@alias QPersistentValue string|number|table|nil|boolean

---@class QuarrelPersistent
local qpersistent = {}

---@type table<string, QPersistentValue>
local inner = {}

--- Store a key-value pair in a persistent store
---@param key string
---@param value QPersistentValue
function qpersistent.store(key, value)
    inner[key] = value
end

--- Get a key-value pair in a persistent store
---@param key string
---@return QPersistentValue
function qpersistent.get(key)
    return inner[key]
end

--- Check if there was a restart
---@return boolean
function qpersistent.is_restart()
    return awesome.get_xproperty "is_restart" ~= nil
end

do
    local ok, content = pcall(qfs.read, "/tmp/qpersistent-store")

    if not ok and not qpersistent.is_restart() then
        gdebug.print_error "failed to read persistent store"
        inner = {}
    else
        inner = qjson.decode(content)
    end
end

awesome.connect_signal("exit", function(restart)
    if not restart then
        return
    end -- we probably errored

    local ok = pcall(qfs.write, qjson.encode(inner), "/tmp/qpersistent-store")
    if not ok then
        gdebug.print_error "failed to open persistent store"
        return
    end

    if not qpersistent.is_restart() then
        awesome.set_xproperty("is_restart", true)
    end
end)

return qpersistent