packages feed

period-0.1.0.7: exec/period.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE RecordWildCards #-}

module Main where

import           Data.Monoid
import qualified Data.Text           as T
import qualified Data.Text.IO        as T
import           Options.Applicative
import           Text.Period
import Text.PrettyPrint.ANSI.Leijen (string)
import Prelude

main :: IO ()
main = execParser (info (helper <*> optParser) $ progDescDoc (Just $ string desc)) >>= runCommand
  where
  desc = "Expand or collapse text representation of date range.\n\
  \\n\
  \period collapse 2018-01-01,2018-12-31\n\
  \=> 2018\n\n\
  \period collapse 2018-01-01,2118-12-31\n\
  \=> 2018,2118\n\n\
  \period expand 2018-01\n\
  \=> 2018-01-01,2018-01-31\n\n\
  \period expand 2018-01-07,14\n\
  \=> 2018-01-07,2018-01-14\
  \"

data Command
  = Collapse {
    colFmt :: PeriodFmt,
    colInput :: T.Text
  } | Expand {
    expFmt :: PeriodFmt,
    expInput :: T.Text,
    expList :: Bool
  }

periodArg :: Parser T.Text
periodArg = argument (T.pack <$> str) (metavar "PERIOD")

parseFmt :: Parser PeriodFmt
parseFmt = PeriodFmt <$>
  option (T.pack <$> str) (
    short 'f' <> long "field-sep" <> value "-" <>
    help "Field separator, by default '-' as in 'yyyy-mm-dd'") <*>
  option (T.pack <$> str) (
    short 'd' <> long "date-sep" <> value "," <>
    help "Start and end separator, by default ',' as in 'yyyy-mm-dd,yyyy-mm-dd'")

mkCommand :: String -> String -> Parser Command -> Mod CommandFields Command
mkCommand cmd desc parser =
  command cmd $ info (helper <*> parser) (progDesc desc)

optParser :: Parser Command
optParser = subparser $ mconcat $
  [ mkCommand "collapse" "Find shortest representation for time period" $
    Collapse <$> parseFmt <*> periodArg
  , mkCommand "expand" "Display start and end points of time period" $
    Expand <$> parseFmt <*> periodArg <*> switch (long "list" <> help "List all days in the period")
  ]

runCommand :: Command -> IO ()
runCommand Collapse{..} = T.putStrLn $ collapsePeriod colFmt $ parsePeriod colInput
runCommand Expand{..} = if
  | expList -> T.putStr . T.unlines . map (collapsePeriod expFmt . (\x -> (x, x))) $ uncurry enumFromTo p
  | otherwise -> T.putStrLn $ formatPeriod expFmt p
  where
  p = parsePeriod expInput