@@ -25,42 +25,46 @@
2525module Network.Google.Types where
2626
2727import Control.Applicative
28−import Control.Exception.Lens (exception)
28+import Control.Exception.Lens (exception)
2929import Control.Lens
3030import Control.Monad.Catch
3131import Control.Monad.Trans.Resource
3232import Data.Aeson
33−import Data.ByteString (ByteString)
34−import qualified Data.ByteString.Char8 as BS8
35−import qualified Data.ByteString.Lazy as LBS
36−import qualified Data.CaseInsensitive as CI
33+import Data.ByteString (ByteString)
34+import qualified Data.ByteString.Char8 as BS8
35+import qualified Data.ByteString.Lazy as LBS
36+import qualified Data.CaseInsensitive as CI
3737import Data.Coerce
3838import Data.Conduit
39−import qualified Data.Conduit.List as CL
39+import qualified Data.Conduit.List as CL
4040import Data.Data
41−import Data.DList (DList)
42−import qualified Data.DList as DList
43−import Data.Foldable (foldl')
41+import Data.DList (DList)
42+import qualified Data.DList as DList
43+import Data.Foldable (foldl')
4444import Data.Monoid
4545import Data.String
46−import Data.Text (Text)
47−import qualified Data.Text.Encoding as Text
48−import Data.Text.Lazy.Builder (Builder)
49−import qualified Data.Text.Lazy.Builder as Build
46+import Data.Text (Text)
47+import qualified Data.Text.Encoding as Text
48+import Data.Text.Lazy.Builder (Builder)
49+import qualified Data.Text.Lazy.Builder as Build
5050import GHC.Generics
5151import GHC.TypeLits
52−import Network.HTTP.Client (HttpException, RequestBody (..))
53−import Network.HTTP.Media hiding (Accept)
54−import Network.HTTP.Types hiding (Header)
55−import qualified Network.HTTP.Types as HTTP
52+import Network.HTTP.Client (HttpException, RequestBody (..))
53+import Network.HTTP.Media hiding (Accept)
54+import Network.HTTP.Types hiding (Header)
55+import qualified Network.HTTP.Types as HTTP
5656import Servant.API
57−import Web.HttpApiData
57+import Web.HttpApiData
5858
5959data AltJSON = AltJSON deriving (Eq, Ord, Show, Read, Generic, Typeable)
6060data AltMedia = AltMedia deriving (Eq, Ord, Show, Read, Generic, Typeable)
6161
6262instance 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"
6468
6569newtype OAuthScope = OAuthScope Text
6670 deriving
@@ -153,7 +157,7 @@ newtype ServiceId = ServiceId Text
153157 )
154158
155159newtype MediaDownload a = MediaDownload a
156−data MediaUpload a = MediaUpload a RequestBody
160+data MediaUpload a = MediaUpload a Part
157161
158162_Coerce :: (Coercible a b, Coercible b a) => Iso' a b
159163_Coerce = iso coerce coerce
@@ -407,23 +411,19 @@ data Captures (s :: Symbol) a
407411data CaptureMode (s :: Symbol) (m :: Symbol) a
408412 deriving (Typeable)
409413
410−data MultipartRelated (cs :: [*]) m b
414+data MultipartRelated (cs :: [*]) m
411415 deriving (Typeable)
412416
413417instance ( ToBody c m
414− , ToBody OctetStream b
415418 , GoogleClient fn
416− ) => GoogleClient (MultipartRelated (c ': cs) m b :> fn) where
417− type Fn (MultipartRelated (c ': cs) m b :> fn) = m -> b -> Fn fn
418−
419− buildClient Proxy rq m b = buildClient (Proxy :: Proxy fn) $
420− setRelated rq
421− [ Part (contentType mc) [] (toBody mc m)
422− , Part (contentType mb) [] (toBody mb b)
423− ]
424− where
425− mc = Proxy :: Proxy c
426− mb = Proxy :: Proxy OctetStream
419+ ) => GoogleClient (MultipartRelated (c ': cs) m :> fn) where
420+ type Fn (MultipartRelated (c ': cs) m :> fn) = m -> Part -> Fn fn
421+
422+ buildClient Proxy rq m b =
423+ buildClient (Proxy :: Proxy fn) $
424+ setRelated rq [Part (contentType mc) [] (toBody mc m), b]
425+ where
426+ mc = Proxy :: Proxy c
427427
428428instance (KnownSymbol s, GoogleClient fn) => GoogleClient (s :> fn) where
429429 type Fn (s :> fn) = Fn fn