module Jenkins.Rest
(
Jenkins
, HasConnectInfo(..)
, ConnectInfo(..)
, defaultConnectInfo
, Result(..)
, runJenkins
, get
, getS
, post
, post_
, concurrently
, orElse
, liftIO
, with
, module Jenkins.Rest.Method
, postXML
, traverseC
, traverseC_
, reload
, restart
, forceRestart
, jenkinsUrl
, jenkinsPort
, jenkinsUser
, jenkinsApiToken
, jenkinsPassword
, _Error
, _Disconnect
, _Result
, JenkinsException(..)
, Request
, HttpException
) where
import Control.Applicative ((<$))
import Control.Lens
import Control.Monad.Trans.Resource (ResourceT, runResourceT)
import Control.Monad.IO.Class (liftIO)
import qualified Data.ByteString as Strict
import qualified Data.ByteString.Lazy as Lazy
import Data.Conduit (ResumableSource, ($$+-))
import qualified Data.Conduit.List as CL
import Data.Monoid (mempty)
import Network.HTTP.Conduit (Request, HttpException)
import Text.XML (Document, renderLBS, def)
import Jenkins.Rest.Internal
import Jenkins.Rest.Method
import Network.HTTP.Conduit.Lens
get :: Method Complete f -> Jenkins Lazy.ByteString
get m = fmap Lazy.fromChunks . liftIO . runResourceT =<< liftJ (Get m ($$+- CL.consume))
getS :: Method Complete f -> Jenkins (ResumableSource (ResourceT IO) Strict.ByteString)
getS m = liftJ (Get m id)
post :: (forall f. Method Complete f) -> Lazy.ByteString -> Jenkins ()
post m body = liftJ (Post m body ())
post_ :: (forall f. Method Complete f) -> Jenkins ()
post_ m = post m mempty
concurrently :: Jenkins a -> Jenkins b -> Jenkins (a, b)
concurrently ja jb = liftJ (Conc ja jb (,))
orElse :: Jenkins a -> Jenkins a -> Jenkins a
orElse ja jb = liftJ (Or ja jb)
with :: (Request -> Request) -> Jenkins a -> Jenkins a
with f j = liftJ $ With f j id
postXML :: (forall f. Method Complete f) -> Document -> Jenkins ()
postXML m = with (requestHeaders <>~ [("Content-Type", "text/xml")]) . post m . renderLBS def
traverseC :: (a -> Jenkins b) -> [a] -> Jenkins [b]
traverseC f = foldr go (return [])
where
go x xs = do (y, ys) <- concurrently (f x) xs; return (y : ys)
traverseC_ :: (a -> Jenkins b) -> [a] -> Jenkins ()
traverseC_ f = foldr (\x xs -> () <$ concurrently (f x) xs) (return ())
reload :: Jenkins a
reload = do post_ "reload"; disconnect
restart :: Jenkins a
restart = do post_ "safeRestart"; disconnect
forceRestart :: Jenkins a
forceRestart = do post_ "restart"; disconnect
disconnect :: Jenkins a
disconnect = liftJ Dcon