From 72347f047fa37b433d0d05d89176e7f082c7bcd3 Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Thu, 2 Apr 2015 21:36:01 +0900 Subject: move code for parsing command line into its own file --- src/Main.hs | 47 ++++---------------------------------- src/Types/Reminder/CmdLine.hs | 15 ++++++++++++ src/Utility/CmdLineRem.hs | 53 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 42 deletions(-) create mode 100644 src/Types/Reminder/CmdLine.hs create mode 100644 src/Utility/CmdLineRem.hs diff --git a/src/Main.hs b/src/Main.hs index c625802..daf31dd 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -21,21 +21,16 @@ -} -import Control.Applicative ((<$>), (<*>)) -import Control.Monad (mapM_) -import Data.List (intercalate) -import System.Environment (getArgs) +import Control.Applicative ((<$>), (<*>)) +import Control.Monad (mapM_) +import System.Environment (getArgs) -import Data.List.Split (oneOf, split) import Data.Time.Calendar -import Data.Time.Format import Data.Time.LocalTime -import Data.Tuple.Sequence (sequenceT) -import System.Locale (defaultTimeLocale) -import Text.Regex.Posix ((=~)) -import Data.Maybe.Read import Types.Reminder +import Types.Reminder.CmdLine +import Utility.CmdLineRem (cmdLineReminder) import Utility.EventCache import Utility.Notify @@ -48,38 +43,6 @@ doCron = do nowRems = filter nowRemsFilter rems mapM_ sendNotification nowRems -cmdLineReminder :: [String] -> Maybe Reminder -cmdLineReminder [] = Nothing -cmdLineReminder [_] = Nothing -cmdLineReminder (exp:textParts) - | exp =~ relativeRegExp :: Bool = do - (h, m) <- parseRelativeTime exp -- TODO: add to current time - makeReminder h m text - | exp =~ absoluteRegExp :: Bool = do - (h, m) <- parseAbsoluteTime exp - makeReminder h m text - | otherwise = Nothing - where - text = intercalate " " textParts - relativeRegExp = "[0-9mh]+[mh]" - absoluteRegExp = "[0-9]{1,2}(:[0-9][0-9])?(am|pm)?" - -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) - appendUserReminder :: Reminder -> IO () appendUserReminder r = do (h, m, d) <- localHMD diff --git a/src/Types/Reminder/CmdLine.hs b/src/Types/Reminder/CmdLine.hs new file mode 100644 index 0000000..b9a311c --- /dev/null +++ b/src/Types/Reminder/CmdLine.hs @@ -0,0 +1,15 @@ +module Types.Reminder.CmdLine where + +import Text.Regex.Posix ((=~)) + +data CmdLineRemType = RelativeCLRem | AbsoluteCLRem + deriving (Eq, Show, Ord, Bounded) + +cmdLineRemType :: String -> Maybe CmdLineRemType +cmdLineRemType exp + | exp =~ relativeRegExp = Just RelativeCLRem + | exp =~ absoluteRegExp = Just AbsoluteCLRem + | otherwise = Nothing + where + relativeRegExp = "[0-9mh]+[mh]" + absoluteRegExp = "[0-9]{1,2}(:[0-9][0-9])?(am|pm)?" 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) -- cgit v1.2.3