packages feed

hasklepias-0.20.0: src/Hasklepias/CohortCollection.hs

{-|
-}

{-# LANGUAGE GADTs #-}

module Hasklepias.CohortCollection 
  ( runCollectionApp
  , getLocations
  , Location(..)
  , Input(..)
  ) where

import           Conduit                        ( (.|)
                                                , foldMapMC
                                                , runConduit
                                                , runResourceT
                                                , yieldMany
                                                )
import           Control.Lens                   ( (<&>)
                                                , (^.)
                                                , set
                                                )
import           Data.Aeson                     ( decode
                                                , encode
                                                )
import qualified Data.ByteString.Char8         as CH
import qualified Data.ByteString.Lazy          as B
import qualified Data.ByteString.Lazy.Char8    as C
                                                ( lines
                                                , putStrLn
                                                , toStrict
                                                )
import           Data.Conduit.Binary            ( sinkLbs )
import qualified Data.Conduit.List             as CL
import           Data.Maybe                     ( fromMaybe )
import qualified Data.Text                     as T
                                                ( pack )
import           Cohort.Output                     ( CohortSetJSON )
import           Network.AWS
import           Network.AWS.S3
import           System.IO                      ( stderr )


data Location where
  Local ::FilePath -> Location
  S3    ::BucketName -> ObjectKey -> Location

getData :: Location -> IO (Maybe CohortSetJSON)
getData (Local x) = decode <$> B.readFile x
getData (S3 b k ) = decode <$> doGetObject b k

doGetObject :: BucketName -> ObjectKey -> IO B.ByteString
doGetObject b k = do
  lgr <- newLogger Debug stderr
  env <- newEnv Discover <&> set envLogger lgr . set envRegion NorthVirginia
  runResourceT . runAWS env $ do
    result <- send $ getObject b k
    (result ^. gorsBody) `sinkBody` sinkLbs

getLocations :: Input -> IO [Location]
getLocations (FileInput d f) = fmap (fmap Local)
                                    (fmap pre . lines <$> readFile f)
 where
  pre = case d of
    Nothing -> (<>) ""
    Just s  -> (<>) (s <> "/")
getLocations (S3Input b k) =
  fmap (\x -> S3 b (ObjectKey $ T.pack $ CH.unpack $ C.toStrict x))
    .   C.lines
    <$> doGetObject b k

-- | 
data Input =
     FileInput (Maybe FilePath) FilePath
   | S3Input BucketName ObjectKey
   deriving (Show)

-- | Run collection on a list of 'Location's
runCollectionApp :: [Location] -> IO B.ByteString
runCollectionApp fs = do
  r <- runConduit $ yieldMany fs .| foldMapMC getData
  let x = fmap encode r
  let z = fromMaybe B.empty x
  return z