aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSean Whitton <spwhitton@spwhitton.name>2015-04-02 21:36:01 +0900
committerSean Whitton <spwhitton@spwhitton.name>2015-04-02 21:36:01 +0900
commit72347f047fa37b433d0d05d89176e7f082c7bcd3 (patch)
treee21fe8e6bbda0940a39e5a06bff23f731ab684fc
parentf3731ce3ebae87054595f6b6ad898c92c1f148aa (diff)
downloadsrem-72347f047fa37b433d0d05d89176e7f082c7bcd3.tar.gz
move code for parsing command line into its own file
-rw-r--r--src/Main.hs47
-rw-r--r--src/Types/Reminder/CmdLine.hs15
-rw-r--r--src/Utility/CmdLineRem.hs53
3 files changed, 73 insertions, 42 deletions
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)