]> git.netwichtig.de Git - user/henk/code/haskell/diddohs.git/blob - Diddo.hs
On branch master
[user/henk/code/haskell/diddohs.git] / Diddo.hs
1 module Diddo
2 ( LogEntry(LogEntry)
3 , DiddoEntry(DiddoEntry)
4 , parseDiddoLogline
5 , formatDiddoEntry
6 , timestamp
7 , logToDiddoEntry
8 ) where
9
10 import Data.DateTime( diffSeconds )
11 import Data.Maybe( fromMaybe )
12 import Data.Time.Clock( UTCTime(), NominalDiffTime(), diffUTCTime )
13 import Data.Time.Format( parseTime, formatTime )
14 import Data.Time.LocalTime( TimeZone() )
15 import Data.Time.LocalTime( ZonedTime(..), zonedTimeToUTC, utcToZonedTime )
16 import System.Locale
17 import qualified Data.Text as T
18
19 data LogEntry = LogEntry
20     { timestamp     :: UTCTime
21     , timezone      :: TimeZone
22     , text          :: T.Text
23     }
24
25 data DiddoEntry = DiddoEntry
26     { startTime     :: ZonedTime
27     , endTime       :: ZonedTime
28     , comment       :: T.Text
29     }
30
31 formatDiddoEntry :: String -> DiddoEntry -> T.Text
32 formatDiddoEntry format entry = T.intercalate (T.pack ";")
33     [ T.pack $ formatTime defaultTimeLocale format (startTime entry)
34     , T.pack $ formatTime defaultTimeLocale format (endTime entry)
35     , T.pack $ diffTimeToHMSString $ diffUTCTime (zonedTimeToUTC (endTime entry)) (zonedTimeToUTC (startTime entry))
36     , comment entry
37     ]
38
39 logToDiddoEntry :: UTCTime -> LogEntry -> DiddoEntry
40 logToDiddoEntry startutc logentry = DiddoEntry startZoned endZoned $ text logentry
41     where
42         startZoned = utcToZonedTime (timezone logentry) startutc
43         endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry
44
45 parseDiddoLogline :: T.Text -> LogEntry
46 parseDiddoLogline line = LogEntry ts tz string
47     where
48         splitLine           = T.splitOn (T.pack ";") line
49         string              = T.intercalate (T.pack ";") $ tail splitLine
50         time                = parseISOsecondsTime $ head splitLine
51         (ts,tz)             = (zonedTimeToUTC time, zonedTimeZone time)
52
53 parseToZonedTime :: String -> String -> ZonedTime
54 parseToZonedTime format string = fromMaybe (error $ "Input data broken: " ++ string) $ parseTime defaultTimeLocale format string
55
56 parseISOsecondsTime :: T.Text -> ZonedTime
57 parseISOsecondsTime timestring = parseToZonedTime (iso8601DateFormat $ Just "%T%z") $ T.unpack timestring
58
59 diffTimeToHMSString :: NominalDiffTime -> String
60 diffTimeToHMSString delta = printf "%d:%02d:%02d" h m s
61     where
62         (mLeft, s) = floor delta `divMod` 60 :: (Int, Int)
63         (h, m)     = mLeft `divMod` 60
64