packages feed

hsakamai-0.1.0.0: app/PurgeMain.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Akamai.Edgegrid
import Akamai.Purge
import Options.Applicative
import Data.Yaml (decodeFileEither,encode)
import qualified Data.ByteString as B
import qualified Data.Text as T
import Network.HTTP.Client (responseBody)


data Command
  = InvalidateUrl Network String
  | InvalidateCpCode Network Int
  | InvalidateTag Network String
  | DeleteUrl Network String
  | DeleteCpCode Network Int
  | DeleteTag Network String
  | Config
  deriving (Eq, Show)

invalidateUrlCmd :: Parser Command
invalidateUrlCmd = InvalidateUrl <$> (argument auto (metavar "network")) <*> (argument str (metavar "url"))

invalidateCpCodeCmd :: Parser Command
invalidateCpCodeCmd = InvalidateCpCode <$> (argument auto (metavar "network")) <*> (argument auto (metavar "cpcode"))

invalidateTagCmd :: Parser Command
invalidateTagCmd = InvalidateTag <$> (argument auto (metavar "network")) <*> (argument str (metavar "tag"))

deleteUrlCmd :: Parser Command
deleteUrlCmd = DeleteUrl <$> (argument auto (metavar "network")) <*> (argument str (metavar "url"))

deleteCpCodeCmd :: Parser Command
deleteCpCodeCmd = DeleteCpCode <$> (argument auto (metavar "network")) <*> (argument auto (metavar "cpcode"))

deleteTagCmd :: Parser Command
deleteTagCmd = DeleteTag <$> (argument auto (metavar "network")) <*> (argument str (metavar "tag"))

configCmd :: Parser Command
configCmd = pure Config

readAuth :: IO (Maybe Auth)
readAuth = do
  v <- decodeFileEither "edgegrid.yml"
  case v of
    Right v' -> return $ Just v'
    Left err -> do
      print err
      return Nothing

run :: Command -> IO Bool
run cmd = do
  case cmd of
    Config -> do
      B.putStr $ encode $ Auth "host" "access-token" "client-token" "client-secret"
      return True
    InvalidateUrl network url -> run' invalidateByUrl network [T.pack url]
    InvalidateCpCode network cpcode -> run' invalidateByCpCode network [cpcode]
    InvalidateTag network tag -> run' invalidateByCacheTag network [T.pack tag]
    DeleteUrl network url -> run' deleteByUrl network [T.pack url]
    DeleteCpCode network cpcode -> run' deleteByCpCode network [cpcode]
    DeleteTag network tag -> run' deleteByCacheTag network [T.pack tag]
  where
    run' fn network arg = do
      mauth <- readAuth
      case mauth of
        Just auth -> do
          v <- fn auth network arg
          B.putStr $ encode $ responseBody v
          return True
        Nothing  -> return False


commands :: Parser Command
commands = subparser
           (  command "invalidate-url"    (info invalidateUrlCmd    (progDesc "invalidate-url"))
           <> command "invalidate-cpcode" (info invalidateCpCodeCmd (progDesc "invalidate-cpcode"))
           <> command "invalidate-tag"    (info invalidateTagCmd    (progDesc "invalidate-tag"))
           <> command "delete-url"        (info deleteUrlCmd        (progDesc "delete-url"))
           <> command "delete-cpcode"     (info deleteCpCodeCmd     (progDesc "delete-cpcode"))
           <> command "delete-tag"        (info deleteTagCmd        (progDesc "delete-tag"))
           <> command "config"            (info configCmd           (progDesc "config"))
           )

opts :: ParserInfo Command
opts = info (commands <**> helper) idm

main :: IO ()
main = do
  cmd <- execParser opts
  _ <- run cmd
  return ()