{-# LANGUAGE OverloadedStrings #-}

module Parse
    ( parseFlexibleTime
    , nonEmptyString
    , nonEmptyText
    ) where

import Control.Applicative ((<|>))
import Data.Text (Text)
import Data.Time (UTCTime)
import Data.Time.Format (defaultTimeLocale, parseTimeM)

-- | Parse @UTCTime@ accepting different formats
parseFlexibleTime :: String -> Maybe UTCTime
parseFlexibleTime :: String -> Maybe UTCTime
parseFlexibleTime String
s =
    let fmts :: [String]
fmts =
            [ String
"%Y-%m-%dT%H:%M:%SZ" -- 2025-08-24T12:34:56Z
            , String
"%Y-%m-%dT%H:%M:%S" -- 2025-08-24T12:34:56
            , String
"%Y-%m-%dT%H:%M" -- 2025-08-24T12:34
            , String
"%Y-%m-%d" -- 2025-08-24
            , String
"%H:%M:%S" -- 12:34:56
            , String
"%H:%M" -- 12:34
            ]
     in (String -> Maybe UTCTime -> Maybe UTCTime)
-> Maybe UTCTime -> [String] -> Maybe UTCTime
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
            (\String
fmt Maybe UTCTime
acc -> Maybe UTCTime
acc Maybe UTCTime -> Maybe UTCTime -> Maybe UTCTime
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> TimeLocale -> String -> String -> Maybe UTCTime
forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> String -> String -> m t
parseTimeM Bool
True TimeLocale
defaultTimeLocale String
fmt String
s)
            Maybe UTCTime
forall a. Maybe a
Nothing
            [String]
fmts

-- | Ensures input is not an empty string
nonEmptyString :: String -> Maybe String
nonEmptyString :: String -> Maybe String
nonEmptyString String
"" = Maybe String
forall a. Maybe a
Nothing
nonEmptyString String
x = String -> Maybe String
forall a. a -> Maybe a
Just String
x

-- | Ensures input is not an empty text
nonEmptyText :: Text -> Maybe Text
nonEmptyText :: Text -> Maybe Text
nonEmptyText Text
"" = Maybe Text
forall a. Maybe a
Nothing
nonEmptyText Text
x = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
x