@@ -55,6 +55,9 @@ import Data.Time.Compat (Day, FormatTime, LocalTime,
55 secondsToNominalDiffTime)
55 secondsToNominalDiffTime)
56import Data.Time.Format.Compat (defaultTimeLocale,
56import Data.Time.Format.Compat (defaultTimeLocale,
57 iso8601DateFormat)
57 iso8601DateFormat)
58+import Data.Time.Calendar.Month.Compat (Month)
59+import Data.Time.Calendar.Quarter.Compat (Quarter, QuarterOfYear (..),
58import Data.Typeable (Typeable)
61import Data.Typeable (Typeable)
59import qualified Data.UUID.Types as UUID
62import qualified Data.UUID.Types as UUID
60import Data.Version (Version, parseVersion,
63import Data.Version (Version, parseVersion,
@@ -516,6 +519,42 @@ instance ToHttpApiData DayOfWeek where
517 toEncodedUrlPiece = unsafeToEncodedUrlPiece
520 toEncodedUrlPiece = unsafeToEncodedUrlPiece
525+instance ToHttpApiData QuarterOfYear where
526+ toUrlPiece Q1 = "q1"
527+ toUrlPiece Q2 = "q2"
528+ toUrlPiece Q3 = "q3"
529+ toUrlPiece Q4 = "q4"
532+-- >>> import Data.Time.Calendar.Quarter.Compat (Quarter (..))
533+-- >>> MkQuarter 8040
536+-- >>> toUrlPiece $ MkQuarter 8040
539+instance ToHttpApiData Quarter where
540+ toUrlPiece q = case toYearQuarter q of
541+ (y, qoy) -> T.pack (show y ++ "-" ++ f qoy)
549+-- >>> import Data.Time.Calendar.Month.Compat (Month (..))
553+-- >>> toUrlPiece $ MkMonth 24482
556+instance ToHttpApiData Month where
557+ toUrlPiece = T.pack . formatTime defaultTimeLocale "%Y-%m"
520instance ToHttpApiData NominalDiffTime where
559instance ToHttpApiData NominalDiffTime where
521 toUrlPiece = toUrlPiece . nominalDiffTimeToSeconds
560 toUrlPiece = toUrlPiece . nominalDiffTimeToSeconds
@@ -704,6 +743,9 @@ instance FromHttpApiData ZonedTime where parseUrlPiece = runAtto Atto.zonedTime
704-- Right 2015-10-03 00:14:24 UTC
743-- Right 2015-10-03 00:14:24 UTC
705instance FromHttpApiData UTCTime where parseUrlPiece = runAtto Atto.utcTime
744instance FromHttpApiData UTCTime where parseUrlPiece = runAtto Atto.utcTime
747+-- >>> parseUrlPiece "Monday" :: Either Text DayOfWeek
707instance FromHttpApiData DayOfWeek where
749instance FromHttpApiData DayOfWeek where
708 parseUrlPiece t = case Map.lookup (T.toLower t) m of
750 parseUrlPiece t = case Map.lookup (T.toLower t) m of
709 Just dow -> Right dow
751 Just dow -> Right dow
@@ -715,6 +757,30 @@ instance FromHttpApiData DayOfWeek where
716instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap secondsToNominalDiffTime . parseUrlPiece
758instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap secondsToNominalDiffTime . parseUrlPiece
761+-- >>> parseUrlPiece "2021-01" :: Either Text Month
763+instance FromHttpApiData Month where parseUrlPiece = runAtto Atto.month
766+-- >>> parseUrlPiece "2021-q1" :: Either Text Quarter
768+instance FromHttpApiData Quarter where parseUrlPiece = runAtto Atto.quarter
771+-- >>> parseUrlPiece "q2" :: Either Text QuarterOfYear
774+-- >>> parseUrlPiece "Q3" :: Either Text QuarterOfYear
776+instance FromHttpApiData QuarterOfYear where
777+ parseUrlPiece t = case T.toLower t of
782+ _ -> Left "Invalid quarter of year"
718instance FromHttpApiData All where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
784instance FromHttpApiData All where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
719instance FromHttpApiData Any where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
785instance FromHttpApiData Any where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)