shellmate-0.2: Control/Shell/Download.hs
-- | Shellmate wrapper for @download-curl@.
module Control.Shell.Download (
URI,
fetch, fetchBytes,
fetchFile,
fetchTags, fetchXML, fetchFeed
) where
import Data.ByteString as BS (ByteString, writeFile)
import Network.Curl.Download as C
import Text.HTML.TagSoup (Tag)
import Text.XML.Light.Types (Content)
import Text.Feed.Types (Feed)
import Control.Shell
-- | A Uniform Resource Locator.
type URI = String
liftE :: IO (Either String a) -> Shell a
liftE m = do
res <- liftIO m
case res of
Left e -> fail e
Right x -> return x
-- | Download content specified by a url using curl, returning the content
-- as a strict 'ByteString'.
fetchBytes :: URI -> Shell ByteString
fetchBytes = liftE . C.openURI
-- | Download content specified by a url using curl, returning the content
-- as a 'String'.
fetch :: URI -> Shell String
fetch = liftE . C.openURIString
-- | Download content specified by a url using curl, writing the content to
-- the file specified by the given 'FilePath'.
fetchFile :: FilePath -> URI -> Shell ()
fetchFile file = fetchBytes >=> liftIO . BS.writeFile file
-- | Download the content as for 'fetch', but return it as a list of parsed
-- tags using the tagsoup html parser.
fetchTags :: URI -> Shell [Tag String]
fetchTags = liftE . C.openAsTags
-- | Download the content as for 'fetch', but return it as parsed XML, using
-- the xml-light parser.
fetchXML :: URI -> Shell [Content]
fetchXML = liftE . C.openAsXML
-- | Download the content as for 'fetch', but return it as as parsed RSS or
-- Atom content, using the feed library parser.
fetchFeed :: URI -> Shell Feed
fetchFeed = liftE . C.openAsFeed