]> git.netwichtig.de Git - user/henk/code/haskell/diddohs.git/blob - Diddo.hs
cbbbce0384d17211bc8e0f8320a0d02e0006aee2
[user/henk/code/haskell/diddohs.git] / Diddo.hs
1 module Diddo
2 ( LogLine(LogLine)
3 , LogEntry(LogEntry)
4 , DiddoEntry(DiddoEntry)
5 , DiddoEntry2(DiddoEntry2)
6 , parseDiddoLogline
7 , formatDiddoEntry
8 , timestamp
9 , logToDiddoEntry
10 ) where
11
12 import HMSTime( HMSTime, secondsToHMS )
13 import Data.List( intercalate )
14 import Data.DateTime( diffSeconds )
15 import Data.Time.LocalTime( TimeZone() )
16 import Data.Time.Clock( UTCTime() )
17 import Data.Maybe( fromMaybe, fromJust )
18 import Data.Time.Format( parseTime, formatTime )
19 import Data.Time.LocalTime( LocalTime(..), ZonedTime(..), TimeZone(..), zonedTimeToUTC, utcToZonedTime, midnight, localDay )
20 import Data.List.Split( splitOn )
21 import System.Locale
22
23 data LogLine
24   = LogLine String
25
26 instance Show LogLine where
27     show (LogLine x) = x
28
29 data LogEntry
30     = LogEntry
31         { timestamp     :: UTCTime
32         , timezone      :: TimeZone
33         , text          :: String
34         }
35
36 instance Show LogEntry where
37     show x = (show $ timestamp x) ++ (show $ timezone x) ++ text x
38
39 data DiddoEntry = DiddoEntry String String HMSTime String
40
41 data DiddoEntry2 = DiddoEntry2
42                     { startTime         :: ZonedTime
43                     , endTime           :: ZonedTime
44                     , comment           :: String
45                     }
46
47 instance Show DiddoEntry where
48   show (DiddoEntry start finish delta entry) = intercalate ";" [start,finish,(show delta),entry]
49
50 instance Show DiddoEntry2 where
51   show (DiddoEntry2 start finish entry) = intercalate ";" [show start,show finish,show $ diffSeconds (zonedTimeToUTC finish) (zonedTimeToUTC start),entry]
52
53 formatDiddoEntry :: String -> DiddoEntry2 -> String
54 formatDiddoEntry format (DiddoEntry2 start end comment) = (formatTime defaultTimeLocale format start) ++ ";" ++ (formatTime defaultTimeLocale format end) ++ ";" ++ (show $ secondsToHMS $ diffSeconds (zonedTimeToUTC end) (zonedTimeToUTC start)) ++ ";" ++ comment
55
56 logToDiddoEntry :: UTCTime -> LogEntry -> DiddoEntry2
57 logToDiddoEntry startutc logentry = DiddoEntry2 startZoned endZoned $ text logentry
58     where
59         startZoned = utcToZonedTime (timezone logentry) startutc
60         endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry
61
62
63 lineToEntry :: LogLine -> LogEntry
64 lineToEntry (LogLine line) = LogEntry ts tz text
65     where
66         splitLine           = splitOn ";" line
67         text                = intercalate ";" $ tail splitLine
68         time                = parseISOsecondsTime $ head splitLine
69         (ts,tz)             = (zonedTimeToUTC time, zonedTimeZone time)
70
71 parseDiddoLogline :: String -> LogEntry
72 parseDiddoLogline line = LogEntry ts tz text
73     where
74         splitLine           = splitOn ";" line
75         text                = intercalate ";" $ tail splitLine
76         time                = parseISOsecondsTime $ head splitLine
77         (ts,tz)             = (zonedTimeToUTC time, zonedTimeZone time)
78
79
80
81
82 parseToZonedTime :: String -> String -> ZonedTime
83 parseToZonedTime format string = fromMaybe (error $ "Input data broken: " ++ string) $ parseTime defaultTimeLocale format string
84
85 parseISOsecondsTime :: String -> ZonedTime
86 parseISOsecondsTime = parseToZonedTime $ iso8601DateFormat $ Just "%T%z"
87