summaryrefslogtreecommitdiff
path: root/src/log.moon
diff options
context:
space:
mode:
authorAlexander M Pickering <alex@cogarr.net>2025-01-09 18:11:46 -0600
committerAlexander M Pickering <alex@cogarr.net>2025-01-09 18:11:46 -0600
commitdecb72f936060a65bff18e9cbf33642ea3a71cd0 (patch)
tree3b07bb1bfc1e4f0e39ec4ff8e0c243cd4fab0d61 /src/log.moon
parent726876d42270f8974fd495be91127ea7585472ff (diff)
downloadggj25-decb72f936060a65bff18e9cbf33642ea3a71cd0.tar.gz
ggj25-decb72f936060a65bff18e9cbf33642ea3a71cd0.tar.bz2
ggj25-decb72f936060a65bff18e9cbf33642ea3a71cd0.zip
Work
Diffstat (limited to 'src/log.moon')
-rw-r--r--src/log.moon66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/log.moon b/src/log.moon
new file mode 100644
index 0000000..3c54dc2
--- /dev/null
+++ b/src/log.moon
@@ -0,0 +1,66 @@
+-- Singleton object to deal with log messages
+class log
+ log: (message, tags, level) ->
+ tags = tags or {}
+ if not level
+ error("Level is required")
+ tag_rev = {tag,true for tag in *tags}
+ chunk =
+ level: level
+ time: os.clock!
+ message: message
+ tags: tag_rev
+ stream_pos = log.messages + 1
+ log.stream[stream_pos] = chunk
+ for tag in *tags
+ log.by_tags[tag] = log.by_tags[tag] or {}
+ table.insert(log.by_tags[tag], stream_pos)
+ log.by_level[level] = log.by_level[level] or {}
+ table.insert(log.by_level[level], stream_pos)
+ log.messages += 1
+ for observer in *log.observers
+ observer(chunk)
+
+ reset: ->
+ log.stream = {}
+ log.messages = 0
+ log.by_tags = {}
+ log.by_level = {}
+ log.observers = {}
+
+ info: (message, tags) ->
+ log.log(message, tags, "info")
+ warn: (message, tags) ->
+ log.log(message, tags, "warn")
+ error: (message, tags) ->
+ log.log(message, tags, "error")
+ panic: (message, tags) ->
+ log.log(message, tags, "panic")
+ observe: (callback) ->
+ table.insert(log.observers, callback)
+ of_level: (level, callback) ->
+ if not log.by_level[level]
+ return
+ for message_idx in *log.by_level[level]
+ callback(log.stream[message_idx])
+ of_tags: (tags, callback) ->
+ if type(tags) ~= "table"
+ tags = {tags}
+ first_tag = tags[1]
+ assert(type(first_tag) == "string", "tag was not a string, was a " .. type(first_tag))
+ if not first_tag
+ error("Must pass a tag")
+ if not log.by_tags[first_tag]
+ return
+ for message_idx in *log.by_tags[first_tag]
+ message = log.stream[message_idx]
+ suitable = true
+ for tag in *tags
+ if not message.tags[tag]
+ suitable = false
+ break
+ if suitable
+ callback(message)
+
+log.reset()
+log