on develop help sign in
Adding internal Base64 type to transparently handle bytes encoding

Fixes #26

commita254f073af77ef078bcc9095d22f826f5f4153a6 authorBrendan Hay <brendan.g.hay@gmail.com> dateTue 14 Jun 2016, 10:29 (10 years ago) parentcdb65aa
3 files changed+81−25
core/gogol-core.cabal+3−1 core/src/Network/Google/Data/Base64.hs+53 core/src/Network/Google/Prelude.hs+25−24
core/gogol-core.cabal+3−1
@@ -36,7 +36,8 @@ library
3636 ghc-options: -Wall
3737
3838 exposed-modules:
39− Network.Google.Data.JSON
39+ Network.Google.Data.Base64
40+ , Network.Google.Data.JSON
4041 , Network.Google.Data.Numeric
4142 , Network.Google.Data.Time
4243 , Network.Google.Prelude
@@ -58,6 +59,7 @@ library
5859 , http-media >= 0.6
5960 , http-types >= 0.8.6
6061 , lens >= 4.4
62+ , memory >= 0.8
6163 , resourcet >= 1.1
6264 , scientific >= 0.3
6365 , servant >= 0.4.4
core/src/Network/Google/Data/Base64.hsnew file+53
@@ -0,0 +1,53 @@
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE DeriveGeneric #-}
3+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4+
5+-- |
6+-- Module : Network.Google.Data.Base64
7+-- Copyright : (c) 2013-2016 Brendan Hay
8+-- License : Mozilla Public License, v. 2.0.
9+-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
10+-- Stability : provisional
11+-- Portability : non-portable (GHC extensions)
12+--
13+module Network.Google.Data.Base64
14+ ( Base64 (..)
15+ , _Base64
16+ ) where
17+
18+import Control.Lens (Iso', iso)
19+import Data.Aeson (FromJSON (..), ToJSON (..))
20+import qualified Data.ByteArray.Encoding as BA
21+import Data.ByteString (ByteString)
22+import qualified Data.ByteString.Char8 as BS8
23+import Data.Data (Data, Typeable)
24+import Data.Hashable
25+import qualified Data.Text.Encoding as Text
26+import GHC.Generics (Generic)
27+import Network.Google.Data.JSON (parseJSONText, toJSONText)
28+import Web.HttpApiData (FromHttpApiData (..),
29+ ToHttpApiData (..))
30+
31+-- | Base64 encoded binary data.
32+--
33+-- Encoding\/decoding is automatically deferred to serialisation and deserialisation
34+-- respectively.
35+newtype Base64 = Base64 { unBase64 :: ByteString }
36+ deriving (Eq, Read, Ord, Data, Typeable, Generic)
37+
38+instance Hashable Base64
39+
40+_Base64 :: Iso' Base64 ByteString
41+_Base64 = iso unBase64 Base64
42+
43+instance ToHttpApiData Base64 where
44+ toQueryParam = Text.decodeUtf8 . toHeader
45+ toHeader = BA.convertToBase BA.Base64 . unBase64
46+
47+instance FromHttpApiData Base64 where
48+ parseQueryParam = parseHeader . Text.encodeUtf8
49+ parseHeader = either fail (pure . Base64) . BA.convertFromBase BA.Base64
50+
51+instance Show Base64 where show = show . BS8.unpack . unBase64
52+instance FromJSON Base64 where parseJSON = parseJSONText "Base64"
53+instance ToJSON Base64 where toJSON = toJSONText
core/src/Network/Google/Prelude.hs+25−24
@@ -10,27 +10,28 @@ module Network.Google.Prelude
1010 ( module Export
1111 ) where
1212
13−import Control.Lens as Export (Lens', lens, mapping,
14− ( # ), (^.), _Just)
15−import Data.Data as Export (Data, Typeable)
16−import Data.Hashable as Export
17−import Data.HashMap.Strict as Export (HashMap)
18−import Data.Int as Export (Int32, Int64)
19−import Data.Maybe as Export
20−import Data.Monoid as Export (mempty, (<>))
21−import Data.Proxy as Export
22−import Data.Text as Export (Text)
23−import Data.Time as Export (Day, TimeOfDay, UTCTime)
24−import Data.Word as Export (Word32, Word64, Word8)
25−import GHC.Generics as Export (Generic)
26−import Network.Google.Data.JSON as Export
27−import Network.Google.Data.Numeric as Export
28−import Network.Google.Data.Time as Export
29−import Network.Google.Types as Export
30−import Network.HTTP.Client as Export (RequestBody)
31−import Numeric.Natural as Export (Natural)
32−import Prelude as Export hiding (product)
33−import Servant.API as Export hiding (getResponse)
34−import Servant.Utils.Links as Export hiding (Link)
35−import Web.HttpApiData as Export (FromHttpApiData (..),
36− ToHttpApiData (..))
13+import Control.Lens as Export (Lens', lens, mapping, ( # ), (^.), _Just)
14+import Data.ByteString as Export (ByteString)
15+import Data.Data as Export (Data, Typeable)
16+import Data.Hashable as Export
17+import Data.HashMap.Strict as Export (HashMap)
18+import Data.Int as Export (Int32, Int64)
19+import Data.Maybe as Export
20+import Data.Monoid as Export (mempty, (<>))
21+import Data.Proxy as Export
22+import Data.Text as Export (Text)
23+import Data.Time as Export (Day, TimeOfDay, UTCTime)
24+import Data.Word as Export (Word32, Word64, Word8)
25+import GHC.Generics as Export (Generic)
26+import Network.HTTP.Client as Export (RequestBody)
27+import Numeric.Natural as Export (Natural)
28+import Prelude as Export hiding (product)
29+import Servant.API as Export hiding (getResponse)
30+import Servant.Utils.Links as Export hiding (Link)
31+import Web.HttpApiData as Export (FromHttpApiData (..), ToHttpApiData (..))
32+
33+import Network.Google.Data.Base64 as Export
34+import Network.Google.Data.JSON as Export
35+import Network.Google.Data.Numeric as Export
36+import Network.Google.Data.Time as Export
37+import Network.Google.Types as Export