diff options
Diffstat (limited to 'Omni/Agent/Log.hs')
| -rw-r--r-- | Omni/Agent/Log.hs | 54 |
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 |
