packages feed

aws-kinesis-reshard-0.1.0.0: src/Aws/Kinesis/Reshard/Options.hs

-- Copyright (c) 2013-2014 PivotCloud, Inc.
--
-- Aws.Kinesis.Reshard.Options
--
-- Please feel free to contact us at licensing@pivotmail.com with any
-- contributions, additions, or other feedback; we would love to hear from
-- you.
--
-- Licensed under the Apache License, Version 2.0 (the "License"); you may
-- not use this file except in compliance with the License. You may obtain a
-- copy of the License at http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-- License for the specific language governing permissions and limitations
-- under the License.
--

{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UnicodeSyntax #-}

module Aws.Kinesis.Reshard.Options where

import qualified Data.Text as T
import Options.Applicative
import Control.Applicative.Unicode
import Control.Lens
import Data.Monoid.Unicode
import Prelude.Unicode

data Options
  = Options
  { _oAccessKey ∷ !T.Text
  , _oSecretAccessKey ∷ !T.Text
  , _oRegion ∷ !T.Text
  , _oStreamName ∷ !T.Text
  , _oSampleDuration ∷ !Integer
  , _oShardCapacityThreshold ∷ !Double
  , _oMaximumShardCount ∷ !Int
  , _oReshardingInterval ∷ !Int
  } deriving Show

makeLenses ''Options

accessKeyParser ∷ Parser T.Text
accessKeyParser =
  fmap T.pack ∘ option str $
    long "access-key"
      ⊕ metavar "AK"
      ⊕ help "Your AWS access key"

secretAccessKeyParser ∷ Parser T.Text
secretAccessKeyParser =
  fmap T.pack ∘ option str $
    long "secret-access-key"
      ⊕ metavar "SK"
      ⊕ help "Your AWS secret access key"

regionParser ∷ Parser T.Text
regionParser =
  fmap T.pack ∘ option str $
    long "region"
      ⊕ short 'r'
      ⊕ metavar "R"
      ⊕ help "The AWS region"
      ⊕ value "us-west-2"
      ⊕ showDefault

streamNameParser ∷ Parser T.Text
streamNameParser =
  fmap T.pack ∘ option str $
    long "stream-name"
      ⊕ short 's'
      ⊕ metavar "SN"
      ⊕ help "The Kinesis stream name"

sampleDurationParser ∷ Parser Integer
sampleDurationParser =
  option auto $
    long "sample-duration"
      ⊕ short 'd'
      ⊕ metavar "SD"
      ⊕ help "The sample duration in seconds"
      ⊕ value (60 * 60)
      ⊕ showDefault

capacityThresholdReader ∷ ReadM Double
capacityThresholdReader = do
  cap ← auto
  if | cap > 0 ∧ cap ≤ 1 → return cap
     | otherwise → readerError "Capacity threshold must be in range (0,1]"

capacityThresholdParser ∷ Parser Double
capacityThresholdParser =
  option capacityThresholdReader $
    long "shard-capacity-threshold"
      ⊕ short 't'
      ⊕ metavar "SCT"
      ⊕ help "The threshold percent capacity per shard (max: 1)"
      ⊕ value 0.1
      ⊕ showDefault

maximumShardCountReader ∷ ReadM Int
maximumShardCountReader = do
  count ← auto
  if | count > 0 ∧ count <= 10 → return count
     | otherwise → readerError "Maximum shard count must be in range [1,10]"

maximumShardCountParser ∷ Parser Int
maximumShardCountParser =
  option maximumShardCountReader $
    long "maximum-shard-count"
      ⊕ short 'c'
      ⊕ metavar "MSC"
      ⊕ help "The maximum number of shards permitted on this stream (max: 10)"
      ⊕ value 5
      ⊕ showDefault

reshardingIntervalParser ∷ Parser Int
reshardingIntervalParser =
  option auto $
    long "resharding-interval"
      ⊕ short 'i'
      ⊕ metavar "RI"
      ⊕ help "The time to wait before reanalyzing the stream in seconds"
      ⊕ value 60000000
      ⊕ showDefault

optionsParser ∷ Parser Options
optionsParser =
  pure Options
    ⊛ accessKeyParser
    ⊛ secretAccessKeyParser
    ⊛ regionParser
    ⊛ streamNameParser
    ⊛ sampleDurationParser
    ⊛ capacityThresholdParser
    ⊛ maximumShardCountParser
    ⊛ reshardingIntervalParser

parserInfo ∷ ParserInfo Options
parserInfo =
  info (helper ⊛ optionsParser) $
    fullDesc
    ⊕ progDesc "Monitor Kinesis throughput and reshard accordingly"
    ⊕ header "The Kinesis Resharder CLI"