{-#LANGUAGE NoImplicitPrelude #-}
{-#LANGUAGE OverloadedStrings #-}
{-#LANGUAGE TypeFamilies #-}
{-#LANGUAGE MultiParamTypeClasses #-}
{-#LANGUAGE FlexibleInstances #-}
{-#LANGUAGE FlexibleContexts #-}
{-#LANGUAGE LambdaCase #-}
module Web.Sprinkles.Backends.Loader.SubprocessLoader
( subprocessLoader
)
where
import Web.Sprinkles.Prelude
import Web.Sprinkles.Backends.Data
( BackendData (..)
, BackendMeta (..)
, BackendSource (..)
, Verification (..)
, Items (..)
, reduceItems
, rawFromLBS
)
import Web.Sprinkles.Backends.Loader.Type
import Network.Mime (MimeType)
import Web.Sprinkles.Logger (LogLevel (..))
import qualified System.Process as Process
subprocessLoader :: Text -> [Text] -> MimeType -> Loader
subprocessLoader cmd args mimeType writeLog _ fetchMode fetchOrder = do
(_, Just hOut, _, _) <-
Process.createProcess
(Process.proc (unpack cmd) (map unpack args)) { Process.std_out = Process.CreatePipe }
body <- hGetContents hOut
let contentLength = fromIntegral $ length body
let meta = BackendMeta
{ bmMimeType = mimeType
, bmMTime = Nothing
, bmName = cmd
, bmPath = unwords $ cmd:args
, bmSize = Just contentLength
}
return [BackendSource meta (rawFromLBS . fromStrict $ body) Trusted]