on develop help sign in
Adding support for google-duration types
commit4fd7579afd4cdb310e98394f0a0743300055c578 authorBrendan Hay <brendan.g.hay@gmail.com> dateTue 25 Oct 2016, 11:23 (10 years ago) parentfd6387e
4 files changed+40−8
core/src/Network/Google/Data/Time.hs+34−8 core/src/Network/Google/Prelude.hs+1 gen/src/Gen/Syntax.hs+3 gen/src/Gen/Types/Schema.hs+2
core/src/Network/Google/Data/Time.hs+34−8
@@ -22,17 +22,22 @@ module Network.Google.Data.Time
2222
2323import Control.Lens
2424import Data.Aeson
25−import qualified Data.Aeson.Types as Aeson
25+import qualified Data.Aeson.Types as Aeson
2626import Data.Attoparsec.Text
27−import Data.Bifunctor (first, second)
28−import Data.Bits ((.&.))
29−import Data.Char (ord)
30−import Data.Data (Data, Typeable)
31−import Data.Text (Text)
32−import qualified Data.Text as Text
27+import Data.Bifunctor (first, second)
28+import Data.Bits ((.&.))
29+import Data.Char (ord)
30+import Data.Data (Data, Typeable)
31+import Data.Scientific (Scientific)
32+import qualified Data.Scientific as Sci
33+import Data.Text (Text)
34+import qualified Data.Text as Text
35+import qualified Data.Text.Lazy.Builder as Build
36+import qualified Data.Text.Lazy.Builder.Scientific as Sci
3337import Data.Time
3438import GHC.Generics
35−import Web.HttpApiData (FromHttpApiData (..), ToHttpApiData (..))
39+import Web.HttpApiData (FromHttpApiData (..),
40+ ToHttpApiData (..))
3641
3742-- | This SHOULD be a time in the format of hh:mm:ss. It is
3843-- recommended that you use the "date-time" format instead of "time"
@@ -66,10 +71,25 @@ newtype DateTime' = DateTime' { unDateTime :: UTCTime }
6671_DateTime :: Iso' DateTime' UTCTime
6772_DateTime = iso unDateTime DateTime'
6873
74+-- | A duration in seconds with up to nine fractional digits, terminated by 's'.
75+--
76+-- /Example/: @"3.5s"@.
77+newtype Duration = Duration { unDuration :: Scientific }
78+ deriving (Eq, Ord, Show, Generic, Data, Typeable)
79+
80+_Duration :: Iso' Duration Scientific
81+_Duration = iso unDuration Duration
82+
6983instance ToJSON Time' where toJSON = String . toQueryParam
7084instance ToJSON Date' where toJSON = String . toQueryParam
7185instance ToJSON DateTime' where toJSON = toJSON . unDateTime
7286
87+instance ToJSON Duration where
88+ toJSON = toJSON
89+ . Build.toLazyText
90+ . Sci.formatScientificBuilder Sci.Fixed (Just 9)
91+ . unDuration
92+
7393instance FromJSON Time' where
7494 parseJSON = fmap Time' . withText "time" (run timeParser)
7595
@@ -79,6 +99,9 @@ instance FromJSON Date' where
7999instance FromJSON DateTime' where
80100 parseJSON = fmap DateTime' . parseJSON
81101
102+instance FromJSON Duration where
103+ parseJSON = fmap Duration . withText "duration" (run durationParser)
104+
82105parseText :: Parser a -> Text -> Either Text a
83106parseText p = first Text.pack . parseOnly p
84107
@@ -100,6 +123,9 @@ dayParser = do
100123 d <- twoDigits
101124 maybe (fail "invalid date") pure (fromGregorianValid y m d)
102125
126+durationParser :: Parser Scientific
127+durationParser = Sci.fromFloatDigits <$> (double <* char 's')
128+
103129-- | Parse a two-digit integer (e.g. day of month, hour).
104130twoDigits :: Parser Int
105131twoDigits = do
core/src/Network/Google/Prelude.hs+1
@@ -19,6 +19,7 @@ import Data.Int as Export (Int32, Int64)
1919import Data.Maybe as Export
2020import Data.Monoid as Export (mempty, (<>))
2121import Data.Proxy as Export
22+import Data.Scientific as Export (Scientific)
2223import Data.Text as Export (Text)
2324import Data.Time as Export (Day, TimeOfDay, UTCTime)
2425import Data.Word as Export (Word32, Word64, Word8)
gen/src/Gen/Syntax.hs+3
@@ -576,6 +576,7 @@ externalLit = \case
576576 RsBody -> TyCon "Stream"
577577 JSONValue -> TyCon "JSONValue"
578578 FieldMask -> TyCon "FieldMask"
579+ Duration -> TyCon "Scientific"
579580
580581internalLit :: Lit -> Type
581582internalLit = \case
@@ -597,6 +598,7 @@ internalLit = \case
597598 RsBody -> TyCon "Stream"
598599 JSONValue -> TyCon "JSONValue"
599600 FieldMask -> TyCon "FieldMask"
601+ Duration -> TyCon "Duration"
600602
601603mapping :: TType -> Exp -> Exp
602604mapping t e = infixE e "." (go t)
@@ -617,6 +619,7 @@ iso = \case
617619 TLit Time -> Just (var "_Time")
618620 TLit Date -> Just (var "_Date")
619621 TLit DateTime -> Just (var "_DateTime")
622+ TLit Duration -> Just (var "_Duration")
620623 TLit Float -> Just (var "_Coerce")
621624 TLit Double -> Just (var "_Coerce")
622625 TLit Byte -> Just (var "_Base64")
gen/src/Gen/Types/Schema.hs+2
@@ -199,6 +199,7 @@ data Lit
199199 | Date
200200 | DateTime
201201 | FieldMask
202+ | Duration
202203
203204 -- Core types.
204205 | RqBody
@@ -229,6 +230,7 @@ instance FromJSON Lit where
229230
230231 "google-datetime" -> pure DateTime
231232 "google-fieldmask" -> pure FieldMask
233+ "google-duration" -> pure Duration
232234
233235 _ -> fail $
234236 "Unable to parse Literal from: " ++ Text.unpack t