module Stackctl.ParameterOption
  ( parameterOption
  ) where

import Stackctl.Prelude

import qualified Data.Text as T
import Options.Applicative
import Stackctl.AWS.CloudFormation (Parameter, makeParameter)

parameterOption :: Parser Parameter
parameterOption :: Parser Parameter
parameterOption =
  forall a. ReadM a -> Mod OptionFields a -> Parser a
option (forall a. (String -> Either String a) -> ReadM a
eitherReader String -> Either String Parameter
readParameter)
    forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
      [ forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'p'
      , forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"parameter"
      , forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"KEY=[VALUE]"
      , forall (f :: * -> *) a. String -> Mod f a
help String
"Override the given Parameter for this operation"
      ]

readParameter :: String -> Either String Parameter
readParameter :: String -> Either String Parameter
readParameter String
s = case Text -> Text -> (Text, Text)
T.breakOn Text
"=" Text
t of
  (Text
_, Text
v) | Text -> Bool
T.null Text
v -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"No '=' found (" forall a. Semigroup a => a -> a -> a
<> String
s forall a. Semigroup a => a -> a -> a
<> String
")"
  (Text
k, Text
_) | Text -> Bool
T.null Text
k -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"Empty key (" forall a. Semigroup a => a -> a -> a
<> String
s forall a. Semigroup a => a -> a -> a
<> String
")"
  (Text
k, Text
"=") -> forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text -> Parameter
makeParameter Text
k forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Text
""
  (Text
k, Text
v) -> forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text -> Parameter
makeParameter Text
k forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Int -> Text -> Text
T.drop Int
1 Text
v
 where
  t :: Text
t = String -> Text
pack String
s