-import System.Environment( getArgs )
-import Data.Time.Git( approxidate )
-import Data.Time.LocalTime( utcToLocalTime, getTimeZone )
-import Data.Time.Clock.POSIX( posixSecondsToUTCTime )
+import Control.Applicative( (<$>), (<*>), liftA, liftA2 )
+import Data.DateTime( parseDateTime, startOfTime, diffSeconds, formatDateTime )
+import Data.List( zip4, zipWith4, transpose )
import Data.List.Split( splitOn )
-import Data.List( zip4, intersperse )
-import Data.Maybe( fromJust )
-import Control.Monad( forM_ )
-import Text.Printf
-
-main = do
- logfile_name : _ <- getArgs
- logfile_content <- readFile logfile_name
- let loglines = lines logfile_content
- loglines_split = map (splitOn ";") loglines
-
- entries = map (head . tail) loglines_split
-
- timestrings_finish = map head loglines_split
- timestrings_start = "" : init timestrings_finish
-
- timestamps_finish = map timestringToEpoch timestrings_finish
- timestamps_start = 0 : init timestamps_finish
-
- timestamps_deltas = zipWith (-) timestamps_finish timestamps_start
- timestamps_deltas_HMMSS = map secondsToHMMSS timestamps_deltas
-
- delta_entry_tuples = zip timestamps_deltas_HMMSS entries
- summaries = zip4 (map show timestrings_start) (map show timestrings_finish) timestamps_deltas_HMMSS entries
-
- forM_ summaries $ \(start, finish, delta, entry) ->
- putStrLn $ concat $ intersperse ";" [start, finish, delta, entry]
-
-timestringToEpoch :: String -> Integer
-timestringToEpoch = fromJust . approxidate
-
-secondsToHMMSS :: (Num seconds, Show seconds, Integral seconds, Text.Printf.PrintfArg seconds) => seconds -> String
-secondsToHMMSS seconds = printf "%d:%02d:%02d" h m s
+import Data.Maybe( fromJust, fromMaybe )
+import Data.Monoid( mempty )
+import Data.Time.Clock( secondsToDiffTime )
+import Options.Applicative( execParser, info, strOption, long )
+import System.Environment( getArgs )
+import HMSTime( HMSTime(..), secondsToHMS )
+import Diddo.Entry( DiddoEntry(..) )
+
+data DiddoOpts = DiddoOpts
+ { inDateFmt :: String
+ , inFile :: String
+ }
+
+mainWithOpts :: DiddoOpts -> IO ()
+mainWithOpts opts = do
+ [timestrings_finish
+ , entries
+ ] <- transpose . map (splitOn ";") . lines <$> readFile (inFile opts)
+ let utcTimes_finish = map (fromMaybe (error "Input data broken.") . parseDateTime (inDateFmt opts)) timestrings_finish
+ entry_deltas_HMMSS = zipWith (\x y -> secondsToHMS $ diffSeconds x y) utcTimes_finish (startOfTime : init utcTimes_finish)
+ diddos_summarized = zipWith4 DiddoEntry ("" : init timestrings_finish) timestrings_finish entry_deltas_HMMSS entries
+
+ mapM_ print diddos_summarized
+
+main :: IO ()
+main = execParser opts >>= mainWithOpts
where
- (mLeft, s) = seconds `divMod` 60
- (h, m) = mLeft `divMod` 60
-
-getStartOfDay :: Num t => t -> t
-getStartOfDay time = 0
-
---epochToTimestring :: Num t => t -> String
---epochToTimestring epochtime = let getTZ = getTimeZone utctime in utcToLocalTime getTZ utctime
--- where
--- tz = getTimeZone utctime
--- utctime = posixSecondsToUTCTime epochtime
-
---getTZ time = do
--- getTimeZone time
+ opts = info parser mempty
+ parser = DiddoOpts
+ <$> strOption ( long "indateform" )
+ <*> strOption ( long "infile" )