Насколько я понимаю, вы хотите направить тело ответа к некоторому каналу, если ответ был успешным, и альтернативному каналу в случае, если ответ не был успешным.
Я считаю, что самое простое решение будет включать«выбирая» канал, используя if ... then ... else
, который у вас уже есть в вашем коде - что-то вроде
module Main where
import Conduit ( printC
)
import Data.Conduit ( runConduitRes
, (.|)
, yield
)
import Data.Conduit.Binary ( sinkFile
)
import Network.HTTP.Simple ( parseRequest
, httpSource
, getResponseStatus
, getResponseBody
)
import Network.HTTP.Types.Status ( statusIsSuccessful
)
main :: IO ()
main = do
requestText <- init <$> readFile "notes/request.txt"
downloadURL requestText "notes/sink.txt"
downloadURL :: String -> FilePath -> IO ()
downloadURL url location = do
request <- parseRequest url
runConduitRes (httpSource request processResponse)
where
processResponse response =
if statusIsSuccessful (getResponseStatus response)
then (getResponseBody response) .| sinkFile location
else yield "an alternate operation" .| printC
. Вы можете заменить yield "an alternate operation" .| printC
другим каналом, который делает то, что вы на самом деле хотите.
Обратите внимание, что теперь sinkFile location
выполняется только в случае успеха, поэтому в случае сбоя файлы не создаются.