packages feed

hw-uri-0.1.1.7: app/App/Commands/Cp.hs

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}

module App.Commands.Cp
  ( cmdCp
  ) where

import Antiope.Core                   (Region (..))
import Antiope.Env                    (mkEnv)
import Antiope.Options.Applicative
import Control.Lens
import Control.Monad.Except
import Control.Monad.Trans.Resource   (runResourceT)
import Data.Generics.Product.Any
import Data.Semigroup                 ((<>))
import HaskellWorks.Data.Uri.Location
import HaskellWorks.Data.Uri.UriError (displayUriError)
import Options.Applicative            hiding (columns)

import qualified App.Aws.Logger                as AWS
import qualified App.Commands.Types            as Z
import qualified Data.Text                     as T
import qualified Data.Text.IO                  as TIO
import qualified HaskellWorks.Data.Uri.IO.Lazy as URI
import qualified System.Exit                   as IO
import qualified System.IO                     as IO
import qualified System.IO.Unsafe              as IO

runCp :: Z.CpOptions -> IO ()
runCp opts = do
  let input       = opts ^. the @"input"
  let output      = opts ^. the @"output"
  let region      = opts ^. the @"region"
  let awsLogLevel = opts ^. the @"awsLogLevel"

  envAws <- IO.unsafeInterleaveIO $ mkEnv region (AWS.awsLogger awsLogLevel)

  result <- runResourceT . runExceptT $ do
    lbsResult <- URI.readResource envAws input

    case lbsResult of
      Right lbs -> void $ URI.writeResource envAws output lbs
      Left _    -> throwError "Copy failed"

  case result of
    Right _  -> return ()
    Left msg -> do
      TIO.hPutStrLn IO.stderr (displayUriError msg)
      IO.exitFailure

optsCp :: Parser Z.CpOptions
optsCp = Z.CpOptions
  <$> option (maybeReader (toLocation . T.pack))
        (   long "input"
        <>  short 'i'
        <>  help "Input location"
        <>  metavar "LOCATION"
        )
  <*> option (maybeReader (toLocation . T.pack))
        (   long "output"
        <>  short 'o'
        <>  help "Output location"
        <>  metavar "LOCATION"
        )
  <*> option auto
      (  long "region"
      <> metavar "AWS_REGION"
      <> showDefault <> value Oregon
      <> help "The AWS region in which to operate"
      )
  <*> optional
      ( option autoText
        (   long "aws-log-level"
        <>  help "AWS Log Level.  One of (Error, Info, Debug, Trace)"
        <>  metavar "AWS_LOG_LEVEL"
        )
      )

cmdCp :: Mod CommandFields (IO ())
cmdCp = command "cp"  $ flip info idm $ runCp <$> optsCp