]> git.netwichtig.de Git - user/henk/code/haskell/diddohs.git/blob - src/Diddo.hs
deleted: Diddo/Entry.hs
[user/henk/code/haskell/diddohs.git] / src / Diddo.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 module Diddo
4 ( LogEntry(LogEntry)
5 , Diddo(Diddo)
6 , formatDiddo
7 , parseDiddoLogline
8 , logToDiddo
9 , parseToZonedTime
10 ) where
11
12 import Data.Maybe( fromMaybe )
13 import Data.Time.Clock( UTCTime(), NominalDiffTime(), diffUTCTime )
14 import Data.Time.Format( FormatTime(), parseTime, formatTime )
15 import Data.Time.LocalTime( TimeZone(), ZonedTime(..), zonedTimeToUTC, utcToZonedTime )
16 import Text.Parsec
17 import System.Locale
18 import Text.Printf( printf )
19 import qualified Data.Text as T
20
21 data LogEntry = LogEntry
22     { timestamp     :: UTCTime
23     , timezone      :: TimeZone
24     , text          :: T.Text
25     }
26
27 data Diddo = Diddo
28     { startTime     :: ZonedTime
29     , endTime       :: ZonedTime
30     , comment       :: T.Text
31     }
32
33 getTimestamp :: Diddo -> UTCTime
34 getTimestamp = zonedTimeToUTC . endTime
35
36 formatDiddo :: String -> Diddo -> T.Text
37 formatDiddo format (Diddo start end text) = T.intercalate ";" diddoline
38     where
39         diddoline           = [startZonedString, endZonedString, delta, text]
40         startZonedString    = timeToText format start
41         endZonedString      = timeToText format end
42         startUTC            = zonedTimeToUTC start
43         endUTC              = zonedTimeToUTC end
44         delta               = diffTimeToHMSString $ diffUTCTime endUTC startUTC
45
46 timeToText :: FormatTime a => String -> a -> T.Text
47 timeToText format = T.pack . formatTime defaultTimeLocale format
48
49 logToDiddo :: UTCTime -> LogEntry -> Diddo
50 logToDiddo startutc logentry = Diddo startZoned endZoned $ text logentry
51     where
52         startZoned = utcToZonedTime (timezone logentry) startutc
53         endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry
54
55 -- parseDiddoLogline' :: T.Text -> (UTCTime, LogEntry)
56 -- parseDiddoLogline' line = (ts, LogEntry ts tz string)
57
58 parseDiddoLogline :: T.Text -> (UTCTime, LogEntry)
59 parseDiddoLogline line = (ts, LogEntry ts tz string)
60     where
61         (timestring:strings)    = T.splitOn ";" line
62         string                  = T.intercalate ";" strings
63         time                    = parseISOsecondsTime timestring
64         (ts,tz)                 = (zonedTimeToUTC time, zonedTimeZone time)
65
66 parseToZonedTime :: String -> String -> ZonedTime
67 parseToZonedTime format string = zt
68     where
69         zt = fromMaybe (error $ "Input data broken: " ++ string) parsedTime
70         parsedTime = parseTime defaultTimeLocale format string
71
72 parseISOsecondsTime :: T.Text -> ZonedTime
73 parseISOsecondsTime timestring = parseToZonedTime (iso8601DateFormat $ Just "%T%z") $ T.unpack timestring
74
75 diffTimeToHMSString :: NominalDiffTime -> T.Text
76 diffTimeToHMSString delta = T.pack $ printf "%d:%02d:%02d" h m s
77     where
78         (mLeft, s) = floor delta `divMod` 60 :: (Int, Int)
79         (h, m)     = mLeft `divMod` 60
80