@@ -28,6 +28,7 @@ import Data.Text.Read (signed, decimal, rational, Reader)
28import qualified Data.Text as T
28import qualified Data.Text as T
29import qualified Data.Text.Lazy as L
29import qualified Data.Text.Lazy as L
31+import Data.Time.Locale.Compat
31import Data.Time
32import Data.Time
32import Data.Version
33import Data.Version
@@ -364,6 +365,26 @@ instance ToHttpApiData Word64 where toUrlPiece = showt
364-- "2015-10-03"
365-- "2015-10-03"
365instance ToHttpApiData Day where toUrlPiece = T.pack . show
366instance ToHttpApiData Day where toUrlPiece = T.pack . show
368+timeToUrlPiece :: FormatTime t => String -> t -> Text
369+timeToUrlPiece fmt = T.pack . formatTime defaultTimeLocale (iso8601DateFormat (Just fmt))
372+-- >>> toUrlPiece $ LocalTime (fromGregorian 2015 10 03) (TimeOfDay 14 55 01)
373+-- "2015-10-03T14:55:01"
374+instance ToHttpApiData LocalTime where toUrlPiece = timeToUrlPiece "%H:%M:%S"
377+-- >>> toUrlPiece $ ZonedTime (LocalTime (fromGregorian 2015 10 03) (TimeOfDay 14 55 01)) utc
378+-- "2015-10-03T14:55:01+0000"
379+instance ToHttpApiData ZonedTime where toUrlPiece = timeToUrlPiece "%H:%M:%S%z"
382+-- >>> toUrlPiece $ UTCTime (fromGregorian 2015 10 03) 864
383+-- "2015-10-03T00:14:24Z"
384+instance ToHttpApiData UTCTime where toUrlPiece = timeToUrlPiece "%H:%M:%SZ"
386+instance ToHttpApiData NominalDiffTime where toUrlPiece = toUrlPiece . (floor :: NominalDiffTime -> Integer)
367instance ToHttpApiData String where toUrlPiece = T.pack
388instance ToHttpApiData String where toUrlPiece = T.pack
368instance ToHttpApiData Text where toUrlPiece = id
389instance ToHttpApiData Text where toUrlPiece = id
369instance ToHttpApiData L.Text where toUrlPiece = L.toStrict
390instance ToHttpApiData L.Text where toUrlPiece = L.toStrict
@@ -445,6 +466,28 @@ instance FromHttpApiData L.Text where parseUrlPiece = Right . L.fromStrict
445-- Right (2016,12,1)
466-- Right (2016,12,1)
446instance FromHttpApiData Day where parseUrlPiece = readTextData
467instance FromHttpApiData Day where parseUrlPiece = readTextData
469+timeParseUrlPiece :: ParseTime t => String -> Text -> Either Text t
470+timeParseUrlPiece fmt = parseMaybeTextData (timeParseUrlPieceMaybe . T.unpack)
472+ timeParseUrlPieceMaybe = parseTime defaultTimeLocale (iso8601DateFormat (Just fmt))
475+-- >>> parseUrlPiece "2015-10-03T14:55:01" :: Either Text LocalTime
476+-- Right 2015-10-03 14:55:01
477+instance FromHttpApiData LocalTime where parseUrlPiece = timeParseUrlPiece "%H:%M:%S"
480+-- >>> parseUrlPiece "2015-10-03T14:55:01+0000" :: Either Text ZonedTime
481+-- Right 2015-10-03 14:55:01 +0000
482+instance FromHttpApiData ZonedTime where parseUrlPiece = timeParseUrlPiece "%H:%M:%S%z"
485+-- >>> parseUrlPiece "2015-10-03T00:14:24Z" :: Either Text UTCTime
486+-- Right 2015-10-03 00:14:24 UTC
487+instance FromHttpApiData UTCTime where parseUrlPiece = timeParseUrlPiece "%H:%M:%SZ"
489+instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap fromInteger . parseUrlPiece
448instance FromHttpApiData All where parseUrlPiece = fmap All . parseUrlPiece
491instance FromHttpApiData All where parseUrlPiece = fmap All . parseUrlPiece
449instance FromHttpApiData Any where parseUrlPiece = fmap Any . parseUrlPiece
492instance FromHttpApiData Any where parseUrlPiece = fmap Any . parseUrlPiece