summaryrefslogtreecommitdiff
path: root/Diddo.hs
blob: cbbbce0384d17211bc8e0f8320a0d02e0006aee2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
module Diddo
( LogLine(LogLine)
, LogEntry(LogEntry)
, DiddoEntry(DiddoEntry)
, DiddoEntry2(DiddoEntry2)
, parseDiddoLogline
, formatDiddoEntry
, timestamp
, logToDiddoEntry
) where

import HMSTime( HMSTime, secondsToHMS )
import Data.List( intercalate )
import Data.DateTime( diffSeconds )
import Data.Time.LocalTime( TimeZone() )
import Data.Time.Clock( UTCTime() )
import Data.Maybe( fromMaybe, fromJust )
import Data.Time.Format( parseTime, formatTime )
import Data.Time.LocalTime( LocalTime(..), ZonedTime(..), TimeZone(..), zonedTimeToUTC, utcToZonedTime, midnight, localDay )
import Data.List.Split( splitOn )
import System.Locale

data LogLine
  = LogLine String

instance Show LogLine where
    show (LogLine x) = x

data LogEntry
    = LogEntry
        { timestamp     :: UTCTime
        , timezone      :: TimeZone
        , text          :: String
        }

instance Show LogEntry where
    show x = (show $ timestamp x) ++ (show $ timezone x) ++ text x

data DiddoEntry = DiddoEntry String String HMSTime String

data DiddoEntry2 = DiddoEntry2
                    { startTime         :: ZonedTime
                    , endTime           :: ZonedTime
                    , comment           :: String
                    }

instance Show DiddoEntry where
  show (DiddoEntry start finish delta entry) = intercalate ";" [start,finish,(show delta),entry]

instance Show DiddoEntry2 where
  show (DiddoEntry2 start finish entry) = intercalate ";" [show start,show finish,show $ diffSeconds (zonedTimeToUTC finish) (zonedTimeToUTC start),entry]

formatDiddoEntry :: String -> DiddoEntry2 -> String
formatDiddoEntry format (DiddoEntry2 start end comment) = (formatTime defaultTimeLocale format start) ++ ";" ++ (formatTime defaultTimeLocale format end) ++ ";" ++ (show $ secondsToHMS $ diffSeconds (zonedTimeToUTC end) (zonedTimeToUTC start)) ++ ";" ++ comment

logToDiddoEntry :: UTCTime -> LogEntry -> DiddoEntry2
logToDiddoEntry startutc logentry = DiddoEntry2 startZoned endZoned $ text logentry
    where
        startZoned = utcToZonedTime (timezone logentry) startutc
        endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry


lineToEntry :: LogLine -> LogEntry
lineToEntry (LogLine line) = LogEntry ts tz text
    where
        splitLine           = splitOn ";" line
        text                = intercalate ";" $ tail splitLine
        time                = parseISOsecondsTime $ head splitLine
        (ts,tz)             = (zonedTimeToUTC time, zonedTimeZone time)

parseDiddoLogline :: String -> LogEntry
parseDiddoLogline line = LogEntry ts tz text
    where
        splitLine           = splitOn ";" line
        text                = intercalate ";" $ tail splitLine
        time                = parseISOsecondsTime $ head splitLine
        (ts,tz)             = (zonedTimeToUTC time, zonedTimeZone time)




parseToZonedTime :: String -> String -> ZonedTime
parseToZonedTime format string = fromMaybe (error $ "Input data broken: " ++ string) $ parseTime defaultTimeLocale format string

parseISOsecondsTime :: String -> ZonedTime
parseISOsecondsTime = parseToZonedTime $ iso8601DateFormat $ Just "%T%z"