working program - with minio monad

This commit is contained in:
Aditya Manthramurthy 2016-12-18 20:08:33 +05:30
parent 07eb59fda5
commit fb6bf1a9cb
4 changed files with 39 additions and 9 deletions

View File

@ -4,10 +4,13 @@ module Main where
import Protolude import Protolude
import Network.Minio.Data
import Network.Minio.API import Network.Minio.API
import Control.Monad.Trans.Resource (MonadResource, ResourceT, runResourceT)
main :: IO () main :: IO ()
main = do main = do
mc <- connect defaultConnectInfo mc <- connect defaultConnectInfo
res <- runMinio mc $ getService res <- runResourceT $ runMinio mc $ getService
print res print $ rpiStatus <$> res

View File

@ -27,14 +27,17 @@ library
, protolude >= 0.1.6 && < 0.2 , protolude >= 0.1.6 && < 0.2
, bytestring , bytestring
, case-insensitive , case-insensitive
, conduit
, containers , containers
, cryptonite , cryptonite
, http-client , http-client
, http-conduit , http-conduit
, http-types , http-types
, memory , memory
, resourcet
, text , text
, time , time
, transformers-base
default-language: Haskell2010 default-language: Haskell2010
default-extensions: OverloadedStrings default-extensions: OverloadedStrings
, NoImplicitPrelude , NoImplicitPrelude
@ -49,6 +52,7 @@ executable minio-hs-exe
, protolude >= 0.1.6 && < 0.2 , protolude >= 0.1.6 && < 0.2
, http-conduit , http-conduit
, http-types , http-types
, resourcet
default-language: Haskell2010 default-language: Haskell2010
default-extensions: OverloadedStrings, NoImplicitPrelude default-extensions: OverloadedStrings, NoImplicitPrelude

View File

@ -12,6 +12,8 @@ import Network.HTTP.Conduit (Response)
import qualified Network.HTTP.Conduit as NC import qualified Network.HTTP.Conduit as NC
import Network.HTTP.Types (Method, Header, Query) import Network.HTTP.Types (Method, Header, Query)
import Control.Monad.Trans.Resource (MonadResource, ResourceT, runResourceT)
import Lib.Prelude import Lib.Prelude
import Network.Minio.Data import Network.Minio.Data
@ -30,7 +32,7 @@ import Network.Minio.Sign.V4
-- -- print $ NC.requestBody r -- -- print $ NC.requestBody r
-- NC.httpLbs r mgr -- NC.httpLbs r mgr
mkSRequest :: RequestInfo -> Minio (Response LByteString) mkSRequest :: RequestInfo -> Minio ResponseInfo
mkSRequest ri = do mkSRequest ri = do
let PayloadSingle pload = payload ri let PayloadSingle pload = payload ri
phash = hashSHA256 pload phash = hashSHA256 pload
@ -56,14 +58,18 @@ mkSRequest ri = do
, NC.requestBody = NC.RequestBodyBS pload , NC.requestBody = NC.RequestBodyBS pload
} }
NC.httpLbs req mgr response <- NC.http req mgr
return $ ResponseInfo
(NC.responseStatus response)
(NC.responseHeaders response)
(NC.responseBody response)
requestInfo :: Method -> Maybe Bucket -> Maybe Object requestInfo :: Method -> Maybe Bucket -> Maybe Object
-> Query -> [Header] -> Payload -> Query -> [Header] -> Payload
-> RequestInfo -> RequestInfo
requestInfo m b o q h p = RequestInfo m b o q h p "" requestInfo m b o q h p = RequestInfo m b o q h p ""
getService :: Minio (Response LByteString) getService :: Minio ResponseInfo
getService = mkSRequest $ getService = mkSRequest $
requestInfo HT.methodGet Nothing Nothing [] [] $ requestInfo HT.methodGet Nothing Nothing [] [] $
PayloadSingle "" PayloadSingle ""

View File

@ -3,6 +3,7 @@ module Network.Minio.Data
( (
ConnectInfo(..) ConnectInfo(..)
, RequestInfo(..) , RequestInfo(..)
, ResponseInfo(..)
, MinioConn(..) , MinioConn(..)
, Bucket , Bucket
, Object , Object
@ -15,10 +16,14 @@ module Network.Minio.Data
) where ) where
import qualified Data.ByteString as B import qualified Data.ByteString as B
import qualified Data.Conduit as C
import Network.HTTP.Client (defaultManagerSettings) import Network.HTTP.Client (defaultManagerSettings)
import Network.HTTP.Types (Method, Header, Query) import Network.HTTP.Types (Method, Header, Query, Status)
import qualified Network.HTTP.Conduit as NC import qualified Network.HTTP.Conduit as NC
import Control.Monad.Trans.Resource (MonadThrow, MonadResource, ResourceT, ResIO)
import Control.Monad.Base (MonadBase)
import Lib.Prelude import Lib.Prelude
data ConnectInfo = ConnectInfo { data ConnectInfo = ConnectInfo {
@ -50,6 +55,12 @@ data RequestInfo = RequestInfo {
, payloadHash :: ByteString , payloadHash :: ByteString
} }
data ResponseInfo = ResponseInfo {
rpiStatus :: Status
, rpiHeaders :: [Header]
, rpiBody :: C.ResumableSource Minio ByteString
}
getPathFromRI :: RequestInfo -> ByteString getPathFromRI :: RequestInfo -> ByteString
getPathFromRI ri = B.concat $ parts getPathFromRI ri = B.concat $ parts
where where
@ -60,15 +71,21 @@ data MinioErr = MErrMsg ByteString
deriving (Show) deriving (Show)
newtype Minio a = Minio { newtype Minio a = Minio {
unMinio :: ReaderT MinioConn (ExceptT MinioErr IO) a unMinio :: ReaderT MinioConn (ExceptT MinioErr (ResourceT IO)) a
} deriving ( }
deriving (
Functor Functor
, Applicative , Applicative
, Monad , Monad
, MonadIO , MonadIO
, MonadReader MinioConn , MonadReader MinioConn
, MonadError MinioErr
, MonadThrow
, MonadBase IO
, MonadResource
) )
-- MinioConn holds connection info and a connection pool -- MinioConn holds connection info and a connection pool
data MinioConn = MinioConn { data MinioConn = MinioConn {
mcConnInfo :: ConnectInfo mcConnInfo :: ConnectInfo
@ -80,5 +97,5 @@ connect ci = do
mgr <- NC.newManager defaultManagerSettings mgr <- NC.newManager defaultManagerSettings
return $ MinioConn ci mgr return $ MinioConn ci mgr
runMinio :: MinioConn -> Minio a -> IO (Either MinioErr a) runMinio :: MinioConn -> Minio a -> ResourceT IO (Either MinioErr a)
runMinio conn = runExceptT . flip runReaderT conn . unMinio runMinio conn = runExceptT . flip runReaderT conn . unMinio