summaryrefslogtreecommitdiff
path: root/Omni/Agent/Log.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Omni/Agent/Log.hs')
-rw-r--r--Omni/Agent/Log.hs54
1 files changed, 53 insertions, 1 deletions
diff --git a/Omni/Agent/Log.hs b/Omni/Agent/Log.hs
index c93479b..28dbab2 100644
--- a/Omni/Agent/Log.hs
+++ b/Omni/Agent/Log.hs
@@ -4,6 +4,10 @@
module Omni.Agent.Log
( LogEntry (..),
+ Status (..),
+ initialStatus,
+ updateStatus,
+ renderStatus,
parseLine,
format,
)
@@ -13,6 +17,7 @@ import Alpha
import Data.Aeson (FromJSON (..), (.:), (.:?))
import qualified Data.Aeson as Aeson
import qualified Data.ByteString.Lazy as BSL
+import qualified Data.Set as Set
data LogEntry = LogEntry
{ leMessage :: Text,
@@ -20,7 +25,8 @@ data LogEntry = LogEntry
leToolName :: Maybe Text,
leBatches :: Maybe [[Text]],
leMethod :: Maybe Text,
- lePath :: Maybe Text
+ lePath :: Maybe Text,
+ leTimestamp :: Maybe Text
}
deriving (Show, Eq, Generic)
@@ -40,6 +46,52 @@ instance FromJSON LogEntry where
.:? "method"
<*> v
.:? "path"
+ <*> v
+ .:? "timestamp"
+
+data Status = Status
+ { sWorkerName :: Text,
+ sTaskId :: Maybe Text,
+ sFiles :: Set.Set Text,
+ sStartTime :: Maybe Text,
+ sLastActivity :: Text
+ }
+ deriving (Show, Eq, Generic)
+
+initialStatus :: Text -> Status
+initialStatus name =
+ Status
+ { sWorkerName = name,
+ sTaskId = Nothing,
+ sFiles = Set.empty,
+ sStartTime = Nothing,
+ sLastActivity = "Idle"
+ }
+
+updateStatus :: LogEntry -> Status -> Status
+updateStatus e s =
+ let s' = case format e of
+ Just msg -> s {sLastActivity = msg}
+ Nothing -> s
+ s'' = case leTimestamp e of
+ Just t -> if isNothing (sStartTime s) then s' {sStartTime = Just t} else s'
+ Nothing -> s'
+ in case (leMessage e, lePath e) of
+ ("ide-fs", Just p) -> s'' {sFiles = Set.insert p (sFiles s'')}
+ _ -> s''
+
+renderStatus :: Status -> Text
+renderStatus s =
+ let line1 =
+ "[Worker: "
+ <> sWorkerName s
+ <> "] "
+ <> "Task: "
+ <> fromMaybe "None" (sTaskId s)
+ <> " | Files: "
+ <> show (Set.size (sFiles s))
+ line2 = sLastActivity s
+ in line1 <> "\n" <> line2
parseLine :: Text -> Maybe LogEntry
parseLine line = Aeson.decode <| BSL.fromStrict <| encodeUtf8 line