diff options
Diffstat (limited to 'src/Utility/CmdLineRem.hs')
-rw-r--r-- | src/Utility/CmdLineRem.hs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/Utility/CmdLineRem.hs b/src/Utility/CmdLineRem.hs new file mode 100644 index 0000000..946c14d --- /dev/null +++ b/src/Utility/CmdLineRem.hs @@ -0,0 +1,53 @@ +module Utility.CmdLineRem (cmdLineReminder) where + +import Types.Reminder.CmdLine + +import Data.List (intercalate) +import Control.Applicative ((<$>)) + +import Data.Tuple.Sequence (sequenceT) +import System.Locale (defaultTimeLocale) +import Data.List.Split (oneOf, split) +import Data.Time.Calendar +import Data.Time.Format +import Data.Time.LocalTime + +import Types.Reminder +import Data.Maybe.Read + +cmdLineReminder :: [String] -> IO (Maybe Reminder) +cmdLineReminder [] = return Nothing +cmdLineReminder [_] = return Nothing +cmdLineReminder input@(exp:textParts) = + case cmdLineRemType exp of + Just AbsoluteCLRem -> + return $ parseAbsoluteRem input + Just RelativeCLRem -> do + tod <- localTimeOfDay <$> zonedTimeToLocalTime <$> getZonedTime + return $ parseRelativeRem tod input + Nothing -> + return Nothing + where + text = intercalate " " textParts + +parseRelativeRem :: TimeOfDay -> [String] -> Maybe Reminder +parseRelativeRem = undefined + +parseAbsoluteRem :: [String] -> Maybe Reminder +parseAbsoluteRem = undefined + +parseRelativeTime :: String -> Maybe (Hour, Minute) +parseRelativeTime exp = + case (split . oneOf) "mh" exp of + [h, "h", m, "m", ""] -> sequenceT (readMaybe h, readMaybe m) + [h, "h", ""] -> sequenceT (readMaybe h, Just 0) + [m, "m", ""] -> sequenceT (Just 0, readMaybe m) + _ -> Nothing + +parseAbsoluteTime :: String -> Maybe (Hour, Minute) +parseAbsoluteTime exp = let formatString = + if last exp == 'm' + then "%k:%M%P" + else "%k:%M" + in parseTime defaultTimeLocale formatString exp + >>= \tod -> Just (todHour tod, todMin tod) |