on develop help sign in
Expose multipart 'Part' types directly to allow specific Content-Type
9debfe3Brendan Hay
core/src/Network/Google/Types.hs+33−33
@@ -25,42 +25,46 @@
25module Network.Google.Types where
25module Network.Google.Types where
26
26
27import Control.Applicative
27import Control.Applicative
28−import Control.Exception.Lens (exception)
28+import Control.Exception.Lens (exception)
29import Control.Lens
29import Control.Lens
30import Control.Monad.Catch
30import Control.Monad.Catch
31import Control.Monad.Trans.Resource
31import Control.Monad.Trans.Resource
32import Data.Aeson
32import Data.Aeson
33−import Data.ByteString (ByteString)
33+import Data.ByteString (ByteString)
34−import qualified Data.ByteString.Char8 as BS8
34+import qualified Data.ByteString.Char8 as BS8
35−import qualified Data.ByteString.Lazy as LBS
35+import qualified Data.ByteString.Lazy as LBS
36−import qualified Data.CaseInsensitive as CI
36+import qualified Data.CaseInsensitive as CI
37import Data.Coerce
37import Data.Coerce
38import Data.Conduit
38import Data.Conduit
39−import qualified Data.Conduit.List as CL
39+import qualified Data.Conduit.List as CL
40import Data.Data
40import Data.Data
41−import Data.DList (DList)
41+import Data.DList (DList)
42−import qualified Data.DList as DList
42+import qualified Data.DList as DList
43−import Data.Foldable (foldl')
43+import Data.Foldable (foldl')
44import Data.Monoid
44import Data.Monoid
45import Data.String
45import Data.String
46−import Data.Text (Text)
46+import Data.Text (Text)
47−import qualified Data.Text.Encoding as Text
47+import qualified Data.Text.Encoding as Text
48−import Data.Text.Lazy.Builder (Builder)
48+import Data.Text.Lazy.Builder (Builder)
49−import qualified Data.Text.Lazy.Builder as Build
49+import qualified Data.Text.Lazy.Builder as Build
50import GHC.Generics
50import GHC.Generics
51import GHC.TypeLits
51import GHC.TypeLits
52−import Network.HTTP.Client (HttpException, RequestBody (..))
52+import Network.HTTP.Client (HttpException, RequestBody (..))
53−import Network.HTTP.Media hiding (Accept)
53+import Network.HTTP.Media hiding (Accept)
54−import Network.HTTP.Types hiding (Header)
54+import Network.HTTP.Types hiding (Header)
55−import qualified Network.HTTP.Types as HTTP
55+import qualified Network.HTTP.Types as HTTP
56import Servant.API
56import Servant.API
57−import Web.HttpApiData
57+import Web.HttpApiData
58
58
59data AltJSON = AltJSON deriving (Eq, Ord, Show, Read, Generic, Typeable)
59data AltJSON = AltJSON deriving (Eq, Ord, Show, Read, Generic, Typeable)
60data AltMedia = AltMedia deriving (Eq, Ord, Show, Read, Generic, Typeable)
60data AltMedia = AltMedia deriving (Eq, Ord, Show, Read, Generic, Typeable)
61
61
62instance ToHttpApiData AltJSON where toQueryParam = const "json"
62instance ToHttpApiData AltJSON where toQueryParam = const "json"
63−instance ToHttpApiData AltMedia where toQueryParam = const "multipart"
63+instance ToHttpApiData AltMedia where toQueryParam = const "media"
64+
65+data Multipart = Multipart deriving (Eq, Ord, Show, Read, Generic, Typeable)
66+
67+instance ToHttpApiData Multipart where toQueryParam = const "multipart"
64
68
65newtype OAuthScope = OAuthScope Text
69newtype OAuthScope = OAuthScope Text
66 deriving
70 deriving
@@ -153,7 +157,7 @@ newtype ServiceId = ServiceId Text
153 )
157 )
154
158
155newtype MediaDownload a = MediaDownload a
159newtype MediaDownload a = MediaDownload a
156−data MediaUpload a = MediaUpload a RequestBody
160+data MediaUpload a = MediaUpload a Part
157
161
158_Coerce :: (Coercible a b, Coercible b a) => Iso' a b
162_Coerce :: (Coercible a b, Coercible b a) => Iso' a b
159_Coerce = iso coerce coerce
163_Coerce = iso coerce coerce
@@ -407,23 +411,19 @@ data Captures (s :: Symbol) a
407data CaptureMode (s :: Symbol) (m :: Symbol) a
411data CaptureMode (s :: Symbol) (m :: Symbol) a
408 deriving (Typeable)
412 deriving (Typeable)
409
413
410−data MultipartRelated (cs :: [*]) m b
414+data MultipartRelated (cs :: [*]) m
411 deriving (Typeable)
415 deriving (Typeable)
412
416
413instance ( ToBody c m
417instance ( ToBody c m
414− , ToBody OctetStream b
415 , GoogleClient fn
418 , GoogleClient fn
416− ) => GoogleClient (MultipartRelated (c ': cs) m b :> fn) where
419+ ) => GoogleClient (MultipartRelated (c ': cs) m :> fn) where
417− type Fn (MultipartRelated (c ': cs) m b :> fn) = m -> b -> Fn fn
420+ type Fn (MultipartRelated (c ': cs) m :> fn) = m -> Part -> Fn fn
418−
421+
422+ buildClient Proxy rq m b =
419− buildClient Proxy rq m b = buildClient (Proxy :: Proxy fn) $
423+ buildClient (Proxy :: Proxy fn) $
420− setRelated rq
421− [ Part (contentType mc) [] (toBody mc m)
424+ setRelated rq [Part (contentType mc) [] (toBody mc m), b]
422− , Part (contentType mb) [] (toBody mb b)
423− ]
424− where
425+ where
425− mc = Proxy :: Proxy c
426+ mc = Proxy :: Proxy c
426− mb = Proxy :: Proxy OctetStream
427
427
428instance (KnownSymbol s, GoogleClient fn) => GoogleClient (s :> fn) where
428instance (KnownSymbol s, GoogleClient fn) => GoogleClient (s :> fn) where
429 type Fn (s :> fn) = Fn fn
429 type Fn (s :> fn) = Fn fn