diff options
author | ben <ben@nagy.contact> | 2025-01-03 15:00:44 -0800 |
---|---|---|
committer | ben <ben@nagy.contact> | 2025-01-03 15:00:44 -0800 |
commit | 7bb4de5c8023f2512645f20c1d28a5954e3fdecf (patch) | |
tree | 6ec27b578d5ec63408cdd64d4a38ca5e8391bf06 /lua/sleep.lua | |
parent | 53158d29ce73b82dfd28362c1b744ab98938d698 (diff) |
added json parser
Diffstat (limited to 'lua/sleep.lua')
-rw-r--r-- | lua/sleep.lua | 121 |
1 files changed, 113 insertions, 8 deletions
diff --git a/lua/sleep.lua b/lua/sleep.lua index d84480e..a47f87e 100644 --- a/lua/sleep.lua +++ b/lua/sleep.lua @@ -1,13 +1,17 @@ -local timer = { +local config_file = "../sleep.json" -- TODO: update path to . + +local time = { minutes = 25, active = false, format = "%02d:%02d:%02d", -- (HH:MM:SS) remaining = nil, + prev_state = { - timestamp = nil, + timestamp = "", + remaining = nil, was_active = false, + last_update = "", -- ISO 8601 }, - config_file = "sleep.json" } local gesture_state = { @@ -16,12 +20,113 @@ local gesture_state = { latency = 3, -- seconds } -local function reinstate_tstamp() - -- call read_config and grab the exported time stamp, then seek to that position in the file + +--[[ todo: +perhaps instead of using a json config_file, we simply write the state attributes at the top of this config_file. +then have test.lua edit itself as need be. +]] + +--[[ +TODO: merge `read_default_time()` and `read_prev_state` + into `read_jsonkey_value(file_str, block_key, value_key)` + then have called by `reinstate_prevstate()` to retrieve keys (timestamp, last_updated, etc.) + and also wherever read_default_time shoudl be called, will retrieve default_time in config block + + (parsing logic is the same, so we should reduce the code) +]] + +--------------------------- +-- JSON PARSER -- +--------------------------- + +local function read_default_time(file_str) + local config_block_i = string.find(file_str, "\"config\"") + if not config_block_i then + print("\"config\" not found in " .. config_file) + return nil + end + + local end_config_i = string.find(file_str, "}", config_block_i) + if not end_config_i then + print("formatting error in " .. config_file) + return nil + end + + local substr = string.sub(file_str, config_block_i, end_config_i) + local def_time = string.match(substr, "\"default_time\"%s*:%s*(%d+)") + + if not def_time then + print("could not extract \"default_time\" value in \"config\" key from " .. config_file) + return nil + end + + return tonumber(def_time) +end + +local function read_prev_state(file_str) + -- we want to extract under previous_state: + -- timestamp + -- last_updated + -- was_active + -- last_update + + local prevstate_block_i = string.find(file_str, "\"previous_state\"") + if not prevstate_block_i then + print("\"previous_state\" block not found in " .. config_file) + return nil + end + + local end_prevstate_i = string.find(file_str, "}", prevstate_block_i) + if not end_prevstate_i then + print("formatting error in " .. config_file) + return nil + end + + local substr = string.sub(file_str, prevstate_block_i, end_prevstate_i) + local tstamp = string.match(substr, "\"timestamp\"%s*:%s*\"(.-)\"") + local lastup = string.match(substr, "\"last_updated\"%s*:%s*\"(.-)\"") + local was_active = string.match(substr, "\"was_active\"%s*:%s*([a-zA-Z]+)") + + if not tstamp then + print("could not extract \"timestamp\" value in \"previous_state\" key from " .. config_file) + return nil + end + + if not lastup then + print("could not extract \"last_updated\" value in \"previous_state\" key from " .. config_file) + return nil + end + + if not was_active then + print("could not extract \"was_active\" value in \"previous_state\" key from " .. config_file) + return nil + end end local function read_config() - -- if failed, then return mock/default settings defined here + print("opening", config_file .. "...") + + local openf = io.input(config_file) + if openf == nil then + print("failed to open", config_file .. "!") + -- TODO: we should make sure it exists, otherwise should create it + end + + local file_str = openf:read("*all") + if file_str == nil or file_str == "" then + print("failed to read config_file into string or config_file is empty") + end + + read_default_time(file_str) + read_prev_state(file_str) + + print("closing", config_file .. ".") + io.close(openf) +end + +local function reinstate_tstamp() + -- call read_config and grab the exported time stamp, then seek to that position in the config_file + -- config_file is, timer end local function export_time() @@ -59,10 +164,10 @@ local function handle_gesture() -- should include debouncing logic for clean gesture input (eg. ignore calls made within some tiny time before each other) end --- called immediately upon opening a media file +-- called immediately upon opening a media config_file function main() mp.osd_message("Sleep timer script initialized!", 3) end mp.add_key_binding(nil, "sleep", handle_gesture) -- the user invokes this by gesturing (user-set in input.conf) -main() -- this is run upon opening a media file +main() -- this is run upon opening a media config_file |