{-# LANGUAGE OverloadedStrings, RecordWildCards, ScopedTypeVariables, TypeApplications #-}
module Network.AWS.CloudFront.SignedCookies.CLI.Decode
( main, mainOpts, Opts (..), optsParser, mainParserInfo
) where
import Network.AWS.CloudFront.SignedCookies
import Network.AWS.CloudFront.SignedCookies.CLI.Internal
import Network.AWS.CloudFront.SignedCookies.Encoding
import qualified Data.Aeson as A
import Data.Aeson.Encode.Pretty (encodePrettyToTextBuilder)
import Data.Coerce (Coercible, coerce)
import Data.Foldable (for_)
import Data.Semigroup ((<>))
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Options.Applicative as Opt
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import qualified Data.Text.Lazy as LText
import qualified Data.Text.Lazy.IO as LText
import Data.Text.Lazy.Builder as Text
import Data.Time.Clock (nominalDay)
main :: IO ()
main = do
opts <- Opt.execParser $ Opt.info (Opt.helper <*> optsParser) infoMod
mainOpts opts
mainOpts :: Opts -> IO ()
mainOpts Opts{..} = do
bs :: BS.ByteString <-
case base64Decode $ coerce @PolicyCookie @Text opt_policyCookie of
Left e -> fail e
Right x -> pure x
value <-
case A.eitherDecode' (LBS.fromStrict bs) of
Left e -> fail e
Right x -> pure x
let
result :: LText.Text =
Text.toLazyText $ encodePrettyToTextBuilder @A.Value value
LText.putStr result
data Opts =
Opts
{ opt_policyCookie :: PolicyCookie
}
optsParser :: Opt.Parser Opts
optsParser =
Opts
<$> text "policy-cookie" "The value of a CloudFront-Policy cookie"
mainParserInfo :: Opt.ParserInfo (IO ())
mainParserInfo =
mainOpts <$> Opt.info optsParser infoMod
infoMod :: Opt.InfoMod a
infoMod =
Opt.header "Decode signed AWS CloudFront policy cookies"